http://blog.163.com/oy_mcu/blog/static/16864297220120193458892/
LDM/STM指令主要用於現場保護,數據復制,參數傳送等。
STMFD指令
STMFD Rn{!},{reglist}{^}

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,由前面解釋偽代碼可得下圖(藍色填充區為地址):

LDMFD 指令
LDMFD Rn{!},{reglist}{^}
這條指令的意思是以Rn為基址(起始地址),取值寫入寄存器列表。
LDMFD SP!,{R0-R7,PC}^
對於這條指令,網上的偽代碼解釋是:
address = SP;
for i = 0 to 7
Ri = Memory[address ,4]
address = address + 4;
SP = address;
個人理解與之相同。。
假設此時SP地址為: 0x4000043C,由前面解釋偽代碼可得下圖(藍色填充區為地址):

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