【问题标题】:Where exactly(!) does the stack pointer point to on x86-CPUs? TO the top element or RIGHT BEHIND it?x86-CPU 上的堆栈指针到底指向哪里(!)?到顶部元素还是在它后面?
【发布时间】: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


【解决方案1】:

假设您处于 32b x86 模式,并且您将地址 100 到 200 的内存保留为堆栈(虚幻,太低,会与 IVT 冲突,但在此示例中可以)。堆栈中已经有一些值,所以esp 是 160。

现在“栈顶值”在地址 160、161、162 和 163 处占用内存(四个字节,因为在 32b 模式下,栈中的单个值是 32b = 4B 大),假设有存储值 @987654322 @。

如果您现在执行push 0x12345678,CPU 将首先从esp 中减去 4 -> 新的esp = 156; (160-4)。然后它将写入 32b 值,以 little-endian 方式分解为四个字节:mem[156] = 0x78, mem[157] = 0x56, mem[158] = 0x34, mem[159] = 0x12

现在如果你执行mov eax,[esp],它将从地址156加载32位值,这意味着它将从地址156、157、158、159的四个字节组成32b值到dword值0x12345678。

最后当你在推送后在调试器中查看内存时,从ss:esp地址查看,它将包含这些字节(十六进制):

0000009C:  78 56 34 12 DD CC BB AA ....

(0x9C = 156 = 内存视图开始的地址)。 esp 指向值的第一个字节,被认为是“栈顶”。

或者当你切换内存视图显示dword值时,为了避免head中的little-endian compose,它会显示:

0000009C:  12345678 AABBCCDD ....

【讨论】:

    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 2010-10-10
    • 2014-08-14
    • 2011-03-14
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多