LDMFD和STMFD個人理解


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)。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM