我是新手来堆叠并试图掌握它,这个堆栈指针的声明一直困扰我几个小时:
“在ARM Cortex-M处理器上,堆栈始终以32位数据运行。所有堆栈访问都是字对齐的,这意味着SP(堆栈指针)的最低有效两位必须始终为0。”
我知道Stack只是RAM的一部分,它包含32位数据,因此所有操作(如PUSH / POP)都需要32位操作。有关该声明的两个问题与我有关:
所有堆栈访问都是“字”对齐的。它应该是DWORD而不是WORD来弥补32位吗?如果没有,为什么Word或16位而不是32位用于所有堆栈访问?
为什么SP的最不重要的两位必须始终为零?
有什么想法吗?
答案 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字大小的倍数(以字节为单位)。