当前位置: 代码迷 >> 汇编语言 >> POPAD 的有关问题
  详细解决方案

POPAD 的有关问题

热度:9748   发布时间:2013-02-26 00:00:00.0
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值”,矛盾在哪里?压栈之后才自减。
  相关解决方案