读书人

POPAD 的有关问题

发布时间: 2012-02-23 22:01:35 作者: rapoo

POPAD 的问题!
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
没弹出一个ESP指针改变一下
当弹出到送到ESP寄存器的时候 ESP的值被改变啦吧?
接下来弹出送到EBX 这时候ESP的值被上次出栈改变掉了 不会是指向原来的地址了吧!
这样后面的出栈操作怎么继续 还是怎样的啊?

[解决办法]

探讨
这么基本的问题怎么会没有答案呢?
《Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual》中对于popa/popad有明确的解释:
...The value on the stack for the ESP or SP register is ignored. Instead, the ESP or SP register is incremented after each register is loaded.

很明显sp/esp的值不用栈中的数据恢复。




[解决办法]
1. pusha/pushad会保存sp/esp。
2. pushad/popad的栈指针是后调整的。
3. 你都知道“PUSHAD功能描述中是说保存未执行命令时的ESP值”,矛盾在哪里?压栈之后才自减。

读书人网 >汇编语言

热点推荐