例如,如果我推 ax 是 [SP] 指向我的 ax 值还是 ax 后面的单词?它也不同于实模式和保护模式吗?我问这个是因为汇编艺术书说明并解释了 sp 指向最后推送的数据,并且在此页面上OSDev Wiki - Stack它说明了它指向最后推送数据后的空字。
问问题
21065 次
4 回答
29
维基百科在这里说:
堆栈是通过隐式递减(推送)和递增(弹出)堆栈指针实现的。在 16 位模式下,这个隐式堆栈指针被寻址为 SS:[SP],在 32 位模式下它是 SS:[ESP],而在 64 位模式下它是 [RSP]。堆栈指针实际上指向最后存储的值,假设它的大小将匹配处理器的操作模式(即 16、32 或 64 位)以匹配 push/pop/call 的默认宽度/ret 指令。
这也是我的回溯记忆所说的方式。
于 2012-12-27T19:56:03.863 回答
23
push eax
相当于:
sub esp, 4
mov [esp], eax
所以在推送之后,esp
将保存推送值的地址。
于 2012-12-27T19:59:43.543 回答
1
根据 Lee Meador 和 Cory Nelson 的回答,堆栈指针指向最后一个被推送的值。
来自英特尔® 64 和 IA-32 架构软件开发人员手册第 2 卷(2A、2B 和 2C):指令集参考,AZ,PUSH 指令描述的第一行如下:
递减堆栈指针,然后将源操作数存储在堆栈顶部。
于 2017-06-23T00:45:00.220 回答
0
我想我明白为什么 OP 会问这个问题。为什么第一个变量是来自 SP 的 8 个字节而不是 4 个?
经过一些研究,我发现这表明:
SP+0 是旧的 EBP SP+4 是旧的 EIP(指令指针)
因此,自然地,第一个参数是 SP+8。
于 2015-08-23T18:36:15.403 回答