为什么MIPS堆栈指针需要保持双字对齐?

5

我在几个地方读到过这个问题,但是没有完全理解为什么。我知道MIPS32中所有指令都必须对齐到4字节,这点我能理解。

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

我理解图片中的所有内容,除了向栈添加空间以填充到8字节的倍数的原因。

Stack Frame

编辑:我看到这个信息的来源之一是这里,第3页,第4个要点。另一个来源是《计算机组成与设计》第5版,作者是Patterson和Hennessey,在附录A.6的“过程调用示例”下。不过,现在我很清楚地意识到,我错误地认为它们谈论的是MIPS32。


3
根据MSDN上的描述:MIPS ISA I和II在32位模式下运行时,要求堆栈指针和帧指针地址对齐到4字节边界。而MIPS ISA III及以上在64位模式下运行时,则要求堆栈指针和帧指针地址对齐到8字节边界。否则,如果您尝试使用sd将64位值推入堆栈,将会导致对齐错误。 - Michael
谢谢Michael。所以这只是一个预防措施,以便可能容纳64位堆栈指针地址或返回地址?即使我们在32位模式下运行? - Nadim Hussami
1
你确定32位MIPS需要8字节的堆栈对齐吗?听起来Michael是在说只有64位模式下才需要8B的要求。然而,在32位模式下,8B对齐将使得在堆栈上存储双精度浮点数变得更加容易,因此一些ABI可能确实需要8B的堆栈对齐。无论如何,请添加一个链接到你阅读这个信息的地方。 - Peter Cordes
1
据我所知,32位MIPS不需要任何硬件原因来进行8字节堆栈对齐。这只是必须的约定的一部分,以便随时能够推送“long long”。在我看来,这个约定只是为了提供一个无缝升级到64位的路径。顺便说一下,SGI MIPS机器需要将堆栈对齐到16字节。 - tofro
这很可能是出于性能的惯例,不应该有硬件要求,如果真有的话,我不确定会是什么样子,如果是硬件要求,较低位的地址将被忽略。 - old_timer
1个回答

4

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

Dominic Sweetman在《See MIPS Run》第320页上说:

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

因此,如果您从未尝试将double推送到堆栈中,则可以在32位系统上使用4字节对齐方式。 不过,您的操作系统是否能够实现这样的对齐方式,还是另一个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接