汇编指令:LDM、STM详解
LDM:(load? much)多數據加載,將地址上的值加載到寄存器上
STM:(store much)多數據存儲,將寄存器的值存到地址上
(1)IA:(Increase After) 每次傳送后地址加4,其中的寄存器從左到右執行,例如:STMIA R0,{R1,LR} 先存R1,再存LR
(2)IB:(Increase Before)每次傳送前地址加4,同上
(3)DA:(Decrease After)每次傳送后地址減4,其中的寄存器從右到左執行,例如:STMDA R0,{R1,LR} 先存LR,再存R1
(4)DB:(Decrease Before)每次傳送前地址減4,同上
(5)FD:? 滿遞減堆棧 (每次傳送前地址減4)
(6)FA:? 滿遞增堆棧 (每次傳送后地址減4)
(7)ED:? 空遞減堆棧 (每次傳送前地址加4)
(8)EA:? 空遞增堆棧 (每次傳送后地址加4)
注意:其中在數據塊的傳輸中是STMMDB和LDMIA對應,STMMIA和LDMDB對應
而在堆棧操作是STMFD和LDMFD對應,STMFA和LDMFA對應
格式:
LDM{cond}? mode? Rn{!}, reglist{^}
STM{cond}? mode? Rn{!}, reglist{^}
其中
?Rn:基址寄存器,裝有傳送數據的起始地址,Rn不允許為R15;
?!:表示最后的地址寫回到Rn中;
?reglist:可包含多于一個寄存器范圍,用“,”隔開,如{R1,R2,R6-R9},寄存器由小到大順序排列;
?^:不允許在用戶模式和系統模式下運行
數據塊的傳輸-實例:
Ldr R1,=0x10000000????????? //傳送數據的起始地址0x10000000?????
LDMIB R1!,{R0,R4-R6}????? //從左到右加載,相當于 LDR R0,10000004? LDR R4,10000008... ...
/*傳送前地址加+4,
所以地址加4,R0=0X1000004地址里的內容,
地址加4,R4=0X10000008地址里的內容,
地址加4,R5=0X1000000C地址里的內容,
地址加4,R6=0X10000010 地址里的內容,
由于!, 最后的地址寫回到R1中,R1=0X10000010? ?*/
總結
以上是生活随笔為你收集整理的汇编指令:LDM、STM详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kmalloc、vmalloc、mall
- 下一篇: Linux vi/vim使用方法 总结