【问题标题】:What is the width of a stack in an Intel IA32 architecture?英特尔 IA32 架构中的堆栈宽度是多少?
【发布时间】:2011-03-09 23:06:16
【问题描述】:

对于 IA32 架构和所有类型的微处理器/微控制器,堆栈的宽度是 8 位宽。

我目前正在阅读http://ozark.hendrix.edu/~burch/csbsju/cs/350/handouts/x86.html 关于汇编语言的内容。在“调用”的解释中,它说堆栈指针正在减少 4,并且程序计数器被推入堆栈。这是否意味着堆栈缓冲区的宽度是 8 位宽,因为程序计数器是 32 位长?我尝试在英特尔 IA32 架构软件开发手册中找到它,但似乎无法确认。

谢谢 思乡

【问题讨论】:

    标签: assembly stack


    【解决方案1】:

    在 IA32 架构中,内存以字节为单位。

    因此,为了将另外 4 个字节放入堆栈,您需要将堆栈指针移动 4。

    【讨论】:

    • 我感觉某个地方有一个不赞成投票的机器人或错误......这似乎突然发生了很多。
    • 谢谢匿名和齿轮,这就是我正在寻找的答案。问候 sziang
    • 正确(将 4 个字节放入堆栈,堆栈指针更改为 4),但没有回答问题。
    【解决方案2】:

    在 x86 CPU 的“堆栈”上推送值的操作(例如,涉及 ESP 的操作,如 PUSH、CALL 等)都以 4 字节增量推送。堆栈的有效宽度为 4 字节/32 位。如果您正在为 x64 CPU 编码,它是 8 字节宽,但您询问的是 IA32。

    我一直将堆栈指针对齐在 4 字节 (DWORD) 边界上。我不知道您是否可以对堆栈进行 DWORD 错位并使其正常工作;如果是这样,则在访问内存以进行推送和弹出(在实际代码中非常频繁地完成)时,您将付出严重的性能损失,因为真正的处理器想要读取较小的二次幂大小的块。

    【讨论】:

    • 英特尔参考手册中,PUSH指令说明:没有“push al”等指令。 “push imm8”通过堆栈指针的大小调整堆栈:“堆栈段的地址大小属性决定堆栈指针大小(16、32 或 64 位)[第 4-320 页 B 卷指令集参考]” .因此,如果您在 16 位模式下运行,它将推动 16 位,但我不认为这是“IA32”模式,至少不符合问题的精神。 (自 1987 年以来,我还没有编写过 16 位宽的堆栈推送)。
    • 实际上,1 也是 2 的小幂 :-) 而且我很惊讶您知道您上次编写 16 位推送的确切年份。但是 +1 用于教育我。无论操作数大小如何,我都没有意识到它们是 32 位推送。猜猜我已经离开 asm 世界太久了。
    • 很容易记住;那一年我得到了我的第一块奔腾芯片和一个真正的 Unix 机器。不再有 16 位的东西。
    【解决方案3】:

    这是我第一次听说“堆栈宽度”。

    push/pop/call/ret 具有默认宽度(与处理器操作模式匹配)。 但是堆栈本身没有宽度。 (对齐是一个完全不同的故事。)

    来自英特尔文档(用于推送):

    "In non-64-bit modes: if the address-size and operand-size attributes are 32,
    the 32-bit ESP register (stack pointer) is decremented by 4.
    If both attributes are 16, the 16-bit SP register (stack pointer)
    is decremented by 2."
    

    [...]

    "In 64-bit mode, the instruction’s default operation size is 64 bits.
    In a push, the 64-bit RSP register (stack pointer) is decremented by 8."
    

    对于手册(总是有最后一个字)检查: Intel Processor Manuals

    【讨论】:

      【解决方案4】:

      表示8位是指令集中最小的可寻址内存单元(一个字节)。 IA32 中的所有内存地址都表示 RAM 中 8 位偏移量的倍数。

      【讨论】:

      • @GJ 我没有说堆栈宽度。 OP想知道为什么压入一个32位的值会使堆栈指针移动4。原因是堆栈指针存储了一个内存地址,而内存地址是基于字节的。我的回答没有错,事实上提问者接受了一个几乎在我之前几秒钟出现的答案。
      • @Cogwheel 但问题是:英特尔 IA32 架构中堆栈的宽度是多少?
      • 当您回答问题时,您有两种选择:1) 根据标题狭义地解释问题,忽略所有其他上下文; 2)阅读提问者的整篇文章,并尝试找出他们试图理解的高级概念。我们选择了 #2,但您对我们投了反对票。
      • @Cogwheel:我投反对票的原因是答案不正确。我预计 Stack Overflow 上的一些人现在知道程序堆栈是什么。但这可能是 Stack Overflow 的另一个问题!
      • @GJ:你似乎完全没有抓住重点......我在回答他在正文中写的问题:“这是否意味着堆栈缓冲区的宽度为 8 位宽,因为程序计数器是 32 位长的吗?”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      相关资源
      最近更新 更多