由于这是一个反复出现的话题,我提出了一个问题。
根据AAPCS:
5.2.1.1通用堆栈约束
- SP mod 4 = 0.堆栈必须始终与字边界对齐
5.2.1.2公共接口的堆栈约束
- SP mod 8 = 0.堆栈必须是双字对齐的。
8字节对齐背后的理性是什么?
答案 0 :(得分:3)
由于ldrd和strd。
他们需要双字对齐。
答案 1 :(得分:3)
主要原因是STRD和LDRD只能在8字节对齐的地址上工作。因此,要在堆栈变量上使用它们,堆栈指针需要始终以8字节对齐。
引用ARM Website:
八字节堆栈对齐对于支持LDRD和STRD指令的处理器特别有用,例如,基于ARM体系结构v5TE及更高版本的处理器。如果堆栈不是八字节对齐,则使用LDRD和STRD可能会导致对齐错误,具体取决于所使用的目标和配置。
ARM还在此ABI Advisory Note中详细解释了它。
答案 2 :(得分:0)
有很多可能的原因;
ldrd/strd
在某些架构上需要它。唯一重要的是,标准如此。如果您不遵守此规范,您的编译器和工具将不会互操作。主要是第1项意味着工具不会互操作。代码将获取错误的值或将引发机器异常。如果异常处理代码使用了第5项,它也可能会破坏事物。
主要是,有人做出选择的事实意味着人们可以利用这个事实来获得他们喜欢和仍在互操作的东西。编译器将遵循标准的建议,因为它们需要与其他库和代码进行互操作。
同样重要的是要注意这适用于ARMv7 / A.例如,Cortex M3的修订版0(CM3_r0)在进入异常时不会将SP与8的倍数对齐。