为什么;ARM体系结构的过程调用标准“;(AAPCS)要求SP为8字节对齐?
由于这是一个反复出现的话题,我提出了一个关于它的问题 根据: 5.2.1.1通用堆栈约束为什么;ARM体系结构的过程调用标准“;(AAPCS)要求SP为8字节对齐?,arm,Arm,由于这是一个反复出现的话题,我提出了一个关于它的问题 根据: 5.2.1.1通用堆栈约束 SP mod 4=0。堆栈必须始终与字边界对齐 5.2.1.2公共接口处的堆栈约束 SP mod 8=0。堆栈必须是双字对齐的 8字节对齐背后的原因是什么?这是由于ldrd和STD 它们需要双字对齐。主要原因是STRD和LDRD只能在8字节对齐的地址上工作。因此,要在堆栈变量上使用它们,堆栈指针需要始终与8字节对齐 引述: 八字节堆栈对齐对于支持LDRD和STD指令的处理器尤其有利,例如,基于ARM
- SP mod 4=0。堆栈必须始终与字边界对齐
- SP mod 8=0。堆栈必须是双字对齐的
8字节对齐背后的原因是什么?这是由于ldrd和STD
它们需要双字对齐。主要原因是STRD和LDRD只能在8字节对齐的地址上工作。因此,要在堆栈变量上使用它们,堆栈指针需要始终与8字节对齐 引述: 八字节堆栈对齐对于支持LDRD和STD指令的处理器尤其有利,例如,基于ARM体系结构v5TE和更高版本的处理器。如果堆栈没有八字节对齐,则使用LDRD和STD可能会导致对齐错误,具体取决于使用的目标和配置
ARM也在本文中详细解释了这一点。可能的原因有很多
ldrd/strd
在某些体系结构上需要它+1但“在为早于ARM V5TE的体系结构(无LDRD或STD)生成的代码中,或在符合ARM V7或更高体系结构的处理器上(当LDRD或STD的有效地址为4模8时,不会导致对齐故障)不会发生此故障。”在ARMv7上,当8字节对齐时,ldm和stm消耗的周期更少,以及指定对齐时的vld和vst。遵守IMO+1是一件容易的事情,但是“在为早于ARM V5TE(无LDRD或STD)的体系结构生成的代码中,或者在符合ARM V7或更高版本体系结构的处理器上(当LDRD或STD的有效地址为4模8时,这不会导致对齐错误)”这是wiki的答案
ldrd/strd
在许多其他问题中给出。最初指出64位对齐提供了更好的总线利用率。