32位ARM协议栈:为什么SP的最低2位必须始终为0?

时间:2018-05-16 22:40:57

标签: arm stack

我是新手来堆叠并试图掌握它,这个堆栈指针的声明一直困扰我几个小时:

“在ARM Cortex-M处理器上,堆栈始终以32位数据运行。所有堆栈访问都是字对齐的,这意味着SP(堆栈指针)的最低有效两位必须始终为0。”

我知道Stack只是RAM的一部分,它包含32位数据,因此所有操作(如PUSH / POP)都需要32位操作。有关该声明的两个问题与我有关:

  1. 所有堆栈访问都是“字”对齐的。它应该是DWORD而不是WORD来弥补32位吗?如果没有,为什么Word或16位而不是32位用于所有堆栈访问?

  2. 为什么SP的最不重要的两位必须始终为零?

  3. 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

1)所有堆栈访问都是" word"对齐。它应该是DWORD而不是WORD来弥补32位吗?如果没有,为什么Word或16位而不是32位用于所有堆栈访问?

单词的大小取决于CPU架构。在32位Cortex-M上,一个字由32位或4个字节组成。

2)为什么SP的最低有效位必须始终为零? <
em> 这是一种不同的方式,表示堆栈应始终在4字节边界上对齐,或者堆栈指针应始终包含一个4字节倍数的地址。

例如,二进制地址0000是0十进制。三个下一个地址,0001(1个十进制),0010,(2个十进制)和0011个(3个十进制)二进制地址的最低有效位设置为01,10和11. 0100(4个十进制)是0000之后的第一个地址将其两个最低有效位设置为0:这与说4个字节的倍数相同,或者如果您愿意,则为CPU字大小的倍数(以字节为单位)。