STMFD 和LDMFD指令


http://blog.163.com/oy_mcu/blog/static/16864297220120193458892/

LDM/STM指令主要用於現場保護,數據復制,參數傳送等。

STMFD指令

STMFD  Rn{!},{reglist}{^}

STMFD和LDMFD指令個人理解分析 - L -

 

 STMFD SP!,{R0-R7,LR}

對於這條指令偽代碼的解釋,網上是這么說的:

SP = SP - 9×4;

  address = SP; 

 for i = 0 to 7

    Memory[address] = Ri;

    address  = address + 4;

Memory[address] = LR;

經過我在keil4的多次調試,個人理解如下:

sp = address;

sp = sp - 4;

Memory[address] = LR;

for( i=7;i>0;i--)

{

 sp = sp-4;

   Memory[address] = Ri;

}

由於ARM堆棧結構是從高向低壓棧的,此時SP即是棧頂。

這里的sp = sp-4,是因為處理器是32位的ARM,所以每次壓一次棧SP就會移動4個字節(32位)。

 

假設此時SP地址為: 0x40000460,由前面解釋偽代碼可得下圖(藍色填充區為地址):

STMFD和LDMFD指令個人理解分析 - L -
 
藍色標注的SP為執行指令前的SP地址,紅色標注的SP是執行指令后的SP地址,由此看出STMFD指令是向下壓棧的。
 
 

 LDMFD 指令

LDMFD  Rn{!},{reglist}{^}

這條指令的意思是以Rn為基址(起始地址),取值寫入寄存器列表。

 STMFD和LDMFD指令個人理解分析 - L -

LDMFD SP!,{R0-R7,PC}^

對於這條指令,網上的偽代碼解釋是:

address = SP;

  for i = 0 to 7

     Ri = Memory[address ,4]

    address = address + 4;

  SP = address;

個人理解與之相同。。
假設此時SP地址為: 0x4000043C,由前面解釋偽代碼可得下圖(藍色填充區為地址):

STMFD和LDMFD指令個人理解分析 - L -

 藍色標注的SP為執行指令前的SP地址,紅色標注的SP是執行指令后的SP地址。


免責聲明!

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



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