【发布时间】:2018-04-28 01:50:55
【问题描述】:
在一些教程中说堆栈指针指向堆栈的顶部元素:
+-------------+
| stack |
+-------------+
| top element | <-- esp
+-------------+
在其他情况下,据说它指向它的 RIGHT BEHIND,因此指向当堆栈增长时可以写入的第一个内存地址。
+-------------+
| stack |
+-------------+
| top element |
+-------------+ <-- esp
在这个德国维基百科网站上 https://de.wikipedia.org/wiki/Register_(Computer)#Stapelregister 据说这两个版本都存在,而且取决于CPU架构。
我的问题是,它在 x86-CPU 上如何?它是否也取决于操作系统?
【问题讨论】:
-
您的第二张图具有误导性,因为它给人的印象是 SP 指向元素之间。如果这就是您的意思,您可能应该在该图中添加一个额外的(空)堆栈槽。
-
我确实将“x86 stack sp”放到了谷歌中,第一个点击是:eli.thegreenplace.net/2011/02/04/…(但这看起来像是“完全愚蠢”的文章,包括很多图片)。 Description of inner workings of
push应该绰绰有余。 (即我责怪你的努力太低了,那么也许你只是以某种方式从搜索中找到了所有错误的结果)。 ...不,CPU 不关心操作系统,x86 不能在这个细节上重新配置,它是固定的。 -
x86 是一个“全降序”类型的堆栈,所以先上图。堆栈指针指向顶部元素,堆栈向下增长。
-
见the ISA reference manual for
push。递减 R/ESP,然后存储,所以qword [rsp]是您刚刚推送的数据。 -
@Ped7g 谢谢你的链接。它们显示了我认为正确的答案,但我对一些教程感到恼火,因为它没有以那种确切的方式显示。但是,当然,更多的研究可能会更清楚地说明问题,但是对于论坛中提出的大多数问题,情况不就是这样吗?当我计算观看教程的时间时,我研究了自己的几个小时。无意冒犯,感谢您的帮助,谢谢。
标签: assembly stack cpu-architecture cpu-registers stack-pointer