例如,如果我把斧子[SP]指向我的斧头的价值或斧后的词吗? 也就是它从实模式转换到保护模式的区别? 我问这个是因为组装本书的艺术说明并解释为sp指向最后推送的数据,并在此页上OSDev维基-堆栈它说明,因为它指向空字后,最后推送的数据。
Answer 1:
维基百科说在这里 :
协议栈与隐式递减(推)实现,并且递增(弹出)堆栈指针。 在16位模式中,该隐含堆栈指针寻址为SS:[SP],在32位模式下,它是SS:[ESP],和在64位模式下,它是[RSP]。 堆栈指针实际上指向被存储的最后一个值 ,在假设其尺寸将匹配处理器的操作模式(即,16,32,或64位)相匹配的压入/弹出/呼叫的默认宽度/ RET指令。
这是我的方式回回忆说它的工作方式了。
Answer 2:
push eax
相当于:
sub esp, 4
mov [esp], eax
所以推后, esp
将持有被推值的地址。
Answer 3:
我想我明白为什么OP在问这个问题。 为什么是第一可变从SP 8个字节,而不是4?
经过一番研究,我发现这表明:
SP + 0是旧EBP SP + 4是旧EIP(指令指针)
因此,自然地,第一参数是在SP + 8。
Answer 4:
按照李Meador的和Cory Nelson的答案,对被撞的最后一个值堆栈指针指向。
从64和IA-32架构软件开发人员手册卷2(2A,2B和2C):指令集,AZ,从PUSH指令的描述中的第一行读取如下:
递减堆栈指针,然后存储在堆栈的顶部的源操作数。
文章来源: x86 where stack pointer points?