ARM里面的堆棧是滿遞減(FULL DESCENDING)的。SP指向最后一個入棧的數據,SP的地址由高向低生長。對於LDM和STM指令來說,編號小的寄存器對應堆棧中的低地址。
STMFD的尋址方式是事先遞減方式(Decrease Before)。內存地址可以用下面的式子表示:
start_address=SP-(Number of register *4)
end_address=SP-4
舉例來說:STMFD SP!,{R1-R7,LR} //SP=0x48000060
入棧后各寄存器存放的地址如下圖所示:
SP后面的!表示SP=SP-(Number of registers *4),在這里入棧后SP指向R1寄存器入棧的地址。
LDMFD的尋址方式是事后遞增方式(Increase After)。內存地址可以用下面的式子表示:
start_address=SP
end_address=SP+(number of registers*4)-4
舉例來說:LDMFD SP!,{R1-R7,LR} //緊跟上例,SP=0x48000040
根據編號小的寄存器對應低地址的原則,0x48000040地址處的值出棧給R1寄存器,0x48000044地址處的值出棧賦給R2寄存器,依次類推。正好與STMFD一一對應。
SP后面的!表示要更新SP的值。SP=SP+(number of registers*4)。