例如,如果我按下ax,[SP]指向我的ax值或ax之后的单词?它是否与实模式保护模式不同?我问这个是因为汇编书的艺术作为最后推送数据的sp点来说明和解释,并且在这个页面OSDev Wiki - Stack它说明了它指向最后推送数据后的空字。
答案 0 :(得分:21)
维基百科说here:
使用隐式递减(推送)和实现堆栈 递增(弹出)堆栈指针。在16位模式下,这个隐式堆栈 指针被称为SS:[SP],在32位模式下,它是SS:[ESP],并且在 64位模式是[RSP]。 堆栈指针实际上指向最后一个 存储的值,假设其大小匹配 处理器的操作模式(即16,32或64位) 匹配push / pop / call / ret指令的默认宽度。
这就是我的回忆记忆它的作用方式。
答案 1 :(得分:15)
push eax
相当于:
sub esp, 4
mov [esp], eax
因此,推送后,esp
将保留推送值的地址。
答案 2 :(得分:0)
我想我明白为什么OP会问这个问题。为什么第一个变量是SP的8个字节,而不是4?
经过一些研究后,我发现this表示:
SP + 0是旧的EBP SP + 4是旧的EIP(指令指针)
因此,当然,第一个参数是SP + 8。
答案 3 :(得分:0)
根据Lee Meador和Cory Nelson的回答,堆栈指针指向最后推送的值。
从英特尔®64和IA-32架构软件开发人员手册第2卷(2A,2B和2C):指令集参考,AZ,PUSH指令描述的第一行内容如下:
递减堆栈指针,然后将源操作数存储在 堆栈顶部。