例如,如果我推斧是[SP]指向我的价值斧或斧头后的单词?它也不同于实模式到保护模式?我问这个问题是因为装配艺术书中的说明和解释是sp指向上次推送的数据,并且在该页面上OSDev Wiki - Stack表示它指向上次推送的数据之后的空白字。x86堆栈指针指向哪里?
回答
维基说here:
协议栈与隐式递减(推)和 递增(弹出)堆栈指针来实现。在16位模式下,这个隐式栈 指针被寻址为SS:[SP],在32位模式下为SS:[ESP],而在 64位模式下为[RSP]。 堆栈指针实际上指向最后的 值,该值存储为,假设其大小将匹配 处理器的操作模式(即16,32或64位)到 与默认宽度匹配推/流行/通话/ ret指令。
这就是我的回忆存储器说它也能工作的方式。
好的,谢谢你,但你有什么想法,为什么osdev wiki在堆栈结束后说明esp。这是一个错误吗? – user1180619
你可以试试。推动一些奇怪的东西,然后看看[esp]是否是相同的值。试着用几个值来确保它不是偶然的。 –
@ user1180619:堆栈颠倒。他们从高地址开始,从那里开始工作。不知道为什么,但事实就是这样。 – Linuxios
push eax
等同于:
sub esp, 4
mov [esp], eax
因此推后,esp
将持有被推值的地址。
我想我明白为什么OP会问这个问题。为什么SP的第一个变量是8字节而不是4?
经过一番研究,我发现this这表明:
SP + 0是旧的EBP SP + 4是旧EIP(指令指针)
因此,自然,第一参数是在SP + 8。
在x86_64的堆栈点是在寄存器%RSP ,其在下部32位部分是公省著名商标作为%ESP
作为每李Meador的和Cory Nelson的答案,在最后一个值的堆栈指针指向该被推。
从64和IA-32架构软件开发人员手册卷2(2A,2B & 2C):指令集,AZ,从PUSH指令的描述中的第一行读取如下:
减少堆栈指针,然后将源操作数存储在堆栈顶部的 上。
- 1. 如何判断指针是指向堆栈还是指向堆?
- 2. 添加指向堆栈的指针C
- 3. 指向堆栈
- 4. ANDing堆栈指针
- 5. 设置后帧指针指向哪里?
- 6. 基指针和堆栈指针
- 7. 使用dwarf2获取堆栈指针的堆栈指针值
- 8. 函数内部的指针变量指向堆栈或堆?
- 9. 使用delete之后,指针是否指向堆栈或堆?
- 10. 找出指针是指向堆栈,堆或程序文本吗?
- 11. 堆栈帧和堆栈指针
- 12. 中断堆栈的堆栈指针
- 13. 堆栈指针和分割
- 14. 线程堆栈指针
- 15. 堆栈指针VS应用
- 16. 汇编堆栈指针AVR
- 17. 初始化堆栈指针
- 18. 返回指令堆栈中的指针
- 19. x86汇编,堆栈推入指令
- 20. 在x86上没有帧指针的堆栈展开
- 21. 在x86实模式下选择堆栈指针地址(对齐)
- 22. 通过堆栈溢出重定向指令指针
- 23. 指向堆栈的C指针导致警告
- 24. C堆栈指向地址?
- 25. LocalFileSystem.PERSISTENT指向哪里?
- 26. phpunit.xml指向哪里?
- 27. “this”指向哪里?
- 28. 如何释放指向堆中指向堆中其他对象的指针类型的指针指针类型?
- 29. 如何检查指针是否指向iOS上的堆或堆栈内存?
- 30. x86 - CALL指令是否总是将EIP指向的地址推送到堆栈?
英特尔参考手册包含每条指令的伪代码。要回答你的问题,它指向堆栈中最高的值。 – DCoder