【发布时间】: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