2012-12-27 100 views
9

例如,如果我推斧是[SP]指向我的价值斧或斧头后的单词?它也不同于实模式到保护模式?我问这个问题是因为装配艺术书中的说明和解释是sp指向上次推送的数据,并且在该页面上OSDev Wiki - Stack表示它指向上次推送的数据之后的空白字。x86堆栈指针指向哪里?

+1

英特尔参考手册包含每条指令的伪代码。要回答你的问题,它指向堆栈中最高的值。 – DCoder

回答

17

维基说here

协议栈与隐式递减(推)和 递增(弹出)堆栈指针来实现。在16位模式下,这个隐式栈 指针被寻址为SS:[SP],在32位模式下为SS:[ESP],而在 64位模式下为[RSP]。 堆栈指针实际上指向最后的 值,该值存储为,假设其大小将匹配 处理器的操作模式(即16,32或64位)到 与默认宽度匹配推/流行/通话/ ret指令。

这就是我的回忆存储器说它也能工作的方式。

+0

好的,谢谢你,但你有什么想法,为什么osdev wiki在堆栈结束后说明esp。这是一个错误吗? – user1180619

+0

你可以试试。推动一些奇怪的东西,然后看看[esp]是否是相同的值。试着用几个值来确保它不是偶然的。 –

+0

@ user1180619:堆栈颠倒。他们从高地址开始,从那里开始工作。不知道为什么,但事实就是这样。 – Linuxios

10
push eax 

等同于:

sub esp, 4 
mov [esp], eax 

因此推后,esp将持有被推值的地址。

0

我想我明白为什么OP会问这个问题。为什么SP的第一个变量是8字节而不是4?

经过一番研究,我发现this这表明:

SP + 0是旧的EBP SP + 4是旧EIP(指令指针)

因此,自然,第一参数是在SP + 8。

-1

在x86_64的堆栈点是在寄存器%RSP ,其在下部32位部分是公省著名商标作为%ESP

0

作为每李Meador的和Cory Nelson的答案,在最后一个值的堆栈指针指向该被推。

从64和IA-32架构软件开发人员手册卷2(2A,2B & 2C):指令集,AZ,从PUSH指令的描述中的第一行读取如下:

减少堆栈指针,然后将源操作数存储在堆栈顶部的 上。