恢复以前的汇编值?

时间:2012-03-14 08:03:45

标签: assembly x86

我想看看EAX的先前值是什么,并且我正在使用POP EAX但是当我尝试使用popad恢复它时它没有恢复它的值它之前我使用{{ 1}}

POP EAX

但是当我执行上述操作时,它不会将其恢复为EAX原始值,我该如何在装配中执行此操作?

3 个答案:

答案 0 :(得分:4)

你正在做什么并没有任何意义。紧接PUSHAD之后的下一类pop命令必须是POPAD才能使堆栈不被破坏(除非你执行相同数量的单个POP来恢复堆栈指针为POPAD。)

PUSHAD将所有通用寄存器推送到堆栈上,之后只有一个POP将从堆栈中拉出一些随机寄存器的值并使堆栈指针指向一个无效的点要POPAD执行。

  • EAX在将其推入堆栈后不会失去其值。
  • POP EAX不会将EAX神奇地填入以前的值。

如果要将EAX与之前的值进行比较,那么您需要将其值存储在另一个寄存器中或作为堆栈中的“本地”变量。

答案 1 :(得分:0)

我暂时没有使用汇编,但我认为我说这里只涉及一个堆栈,因此POP正在删除PUSHAD推送到堆栈中的一个值,所以当你使用时POPAD使用PUSHAS最初推送的所有值都将位于其他通用寄存器中。如果this article正确,那么您的EAX可能在ECX中吗?

答案 2 :(得分:0)

使用

PUSH  EAX 

instedad

PUSHAD

PUSHAD的oposite指令是POPAD,存储或恢复8个寄存器到堆栈。

在PUSHAD之后,您还可以使用8 pop指令恢复堆栈。

    mov  eax, 123456
    pushad      //store 8 registers to stack: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
//
    pop  eax    //restore EDI
    pop  eax    //restore ESI
    pop  eax    //restore EBP
    pop  eax    //restore ESP
    pop  eax    //restore EBX
    pop  eax    //restore EDX
    pop  eax    //restore ECX
    pop  eax    //restore EAX   now the eax register contain start value 123456