32位ARM栈疑问:为何SP最低两位必须始终为0?
关于ARM Cortex-M栈指针(SP)的两个疑问解答
嘿,刚接触ARM栈相关知识时,确实容易被架构术语和对齐规则搞懵,我来帮你理清这两个问题:
1. 为什么用"Word对齐"而非"DWORD"?
这个困惑完全是不同CPU架构的术语定义差异导致的:
- 在x86架构的语境里,"Word"指16位数据,"DWORD"(Double Word)才代表32位;
- 但在ARM官方文档的定义里,"Word"本身就是32位数据,对应的16位数据被称为"Halfword",64位则是"Doubleword"。
所以ARM Cortex-M文档里说的"字对齐(word aligned)"就是指32位数据的对齐要求,完全不需要替换成DWORD——只是别被x86的术语习惯带偏就好啦。
2. 为什么SP的最低两位必须始终为0?
核心原因要从对齐的本质和ARM硬件设计来看:
- 32位数据(ARM定义的Word)需要占用4个连续字节,因此它的起始地址必须是4的整数倍;
- 4的整数倍在二进制里的特征就是最低两位为0(比如0x0004、0x1008,二进制最后两位都是
00)。
对于ARM Cortex-M处理器来说:
- 硬件强制要求栈操作(
PUSH/POP)都是32位的字访问,必须满足字对齐规则; - 如果SP的最低两位不为0,意味着栈指针指向的地址不是4的倍数,此时处理器会触发对齐故障(Alignment Fault),直接导致程序崩溃。
另外,对齐要求也能提升内存访问效率——ARM的内存总线是按32位设计的,对齐的地址可以让硬件一次性完成数据读写,不用拆分操作。
内容的提问来源于stack exchange,提问作者huynh213
相关产品推荐
相关产品推荐

