【问题标题】:Why does the MIPS stack pointer need to be kept double word aligned?为什么 MIPS 堆栈指针需要保持双字对齐?
【发布时间】:2017-02-08 18:16:57
【问题描述】:

我在几个地方读过这篇文章,但没有完全理解为什么。我明白为什么所有指令都必须与 MIPS32 中的 4 个字节字对齐。

但后来我读到堆栈帧需要是 8 的倍数,因为堆栈指针需要双字对齐。为什么?

我理解所附图像中的所有内容,除了添加空白空间以将堆栈填充为 8 字节的倍数的原因。

编辑:我读到这篇文章的一个来源是here,第 3 页,第 4 点。另一个是计算机组织与设计,第 5 版,Patterson 和 Hennessey,附录 A.6,在过程调用示例下。但是,我现在很清楚,我误以为他们在谈论 MIPS32。

【问题讨论】:

  • 来自 MSDN:“MIPS ISA I 和 II,在 32 位模式下运行,要求堆栈指针和帧指针地址在 4 字节边界上对齐。MIPS ISA III 及更高版本,在 64 位模式下运行,要求堆栈指针和帧指针地址在 8 字节边界上对齐。” 否则,如果您尝试使用 sd 将 64 位值压入堆栈,您会出现对齐错误。
  • 谢谢迈克尔。所以这只是为了预防可能容纳 64 位堆栈指针地址或返回地址?即使我们在 32 位模式下运行?
  • 您确定 32 位 MIPS 需要 8 字节堆栈对齐吗?听起来 Michael 是在说 8B 要求仅适用于 64 位模式。但是,8B 对齐可以很容易地以 32 位模式将 double-precision 浮点数存储在堆栈上,因此某些 ABI 可能需要 8B 堆栈对齐。无论如何,请在您阅读本文的地方添加一个链接。
  • 据我所知,32 位 MIPS 确实需要 8 字节堆栈对齐,因为任何硬件原因。这只是能够随时推送long long 所需的约定的一部分。恕我直言的约定只是为了提供到 64 位的无缝升级路径。 SGI MIPS 机器 BTW 要求堆栈对齐到 16 个字节。
  • 这很可能是性能约定,应该没有硬件要求,不确定如何真的有,如果是硬件要求,低地址位将被忽略。

标签: assembly stack mips mips32


【解决方案1】:

MIPS 架构只能访问内存中与其大小均匀对齐的数据类型。

参见 MIPS Run,Dominic Sweetman 在第 320 页说:

在调用子例程时,sp 必须是八字节对齐的,与最大基本类型的对齐方式相匹配 - long long 整数或浮点双精度数。 32 位 MIPS 整数硬件不需要 8 字节对齐,但它对于兼容性至关重要...

因此,如果您从不尝试将double 压入堆栈,那么您可以在 32 位系统上很好地使用 4 字节对齐。不过,您的操作系统是否可以,则是另一个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多