初学ARM指令时,如果从字面上理解满堆栈和空堆栈很有可能会歪曲它们的意思。可以想象一下,“满堆栈”就是一个满的堆栈,不能再存储数据了;而“空堆栈”就是一个空的堆栈,没有被使用的堆栈,呵呵,这样理解的话那就错了。
实际上“满堆栈”和“空堆栈”确切的说应该是“满栈”或者是“空栈”,我们只是习惯了把栈叫做堆栈。而二者深层的意思是说的“位置”或者“地址”,而不是“堆栈”。如果叫“满位置”或者“空位置”更容易理解一些。下面是《ARM嵌入式系统开发 --软件设计与优化》书中给的解释:
满堆栈(full stack,“F”)是指堆栈指针指向堆栈的最后一个已使用的地址或者满位置(也就是sp指向堆栈最后一个数据项位置)。
空堆栈(empty stack,"E")是指sp指向堆栈的第一个没有使用的地址或者空位置(也就是说sp指向堆栈最后一个数据项的下一个位置)。
满堆栈的关键词是最后一个已使用的地址,空堆栈是第一个没有使用的地址。
ARM体系结构使用多寄存器指令load-store来完成堆栈操作。在指令上加上后缀FA、FD、EA、ED(F-满位置,E-空位置,-递增,D-递减)来表示sp指针的寻址方式,如FA表示递增满。
下面是 《ARM嵌入式系统开发 --软件设计与优化》书中的两个例子,但是第一个例子好像是有错误。将sp=0x00080014写成了0x00000004,这里改正过来了。其中1例子说明满栈,2例子说明了空栈。
例1
PRE
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080014
STMFD sp!, {r1, r4}
POST
r1 = 0X00000002
r4 = 0x00000003
sp = 0x0008000c
例2
PRE
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080010
STMFD sp!, {r1, r4}
POST
r1 = 0X00000002
r4 = 0x00000003
sp = 0x00080008