我想看看EAX的先前值是什么,并且我正在使用POP EAX
但是当我尝试使用popad恢复它时它没有恢复它的值它之前我使用{{ 1}}
POP EAX
但是当我执行上述操作时,它不会将其恢复为EAX原始值,我该如何在装配中执行此操作?
答案 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