三、ARM指令2学习课件.pptx
三、ARM指令系统;寻址方式;LDMIAR1,{R0,R2,R5};R0←[R1]
;R2←[R1+4]
;R5←[R1+8]
LDMIBR1,{R0,R2,R5};R0←[R1+4]
;R2←[R1+8]
;R5←[R1+12]
LDMDAR1,{R0,R2,R5};R5←[R1]
;R2←[R1-4]
;R0←[R1-8]
LDMDBR1,{R0,R2,R5};R5←[R1-4]
;R2←[R1-8]
;R0←[R1-12]
;ARM存储器访问指令——多寄存器存取;;栈底;;栈底;栈底;栈底;栈底;数据块传送
存储;应用示例:S3C44B0部分启动代码;简单的ARM程序;§3.3ARM指令系统介绍;存储器寻址;(一)存储器访问指令(Load/Store)
1、单字和无符号字节Load/Store指令
2、半字和有符号字节Load/Store指令
3、双字Load/Store指令
4、多寄存器Load/Store指令
5、内存与寄存器交换指令
;(一)存储器访问(Load/Store)指令
1.单字和无符号字节Load/Store指令
功能:提供ARM寄存器和内存之间单字节
(8位)或单字(32位)数据的传送。
LDR/STR的功能
;LDR和STR——字和无符号字节加载/存储指令编码;字节码结构;指令格式:
(1)零偏移
LDR/STR{〈条件码〉}{B}{T}Rd,[Rn]
;((Rn))→Rd
功能:将Rn的内容作为传送数据的地址。
B:可选后缀,若有B,则传送Rd的最低有效字节。
若操作码是LDR,则将Rd的其它字节清零。(加载无符字节数据,零扩展到32位)
;(1)零偏移
Rd:ARM寄存器
Rn:存储器的基址寄存器,若指令是带写回的前变址(加后缀“!”)或后变址。
;(2)前变址
LDR/STR{条件码}{B}Rd,[Rn,offset]{!}
;((Rn)+offset)→Rd;
;有“!”,则(Rn)+offset→Rn
;无“!”,Rn不变;(2)前变址
在数据传送之前,将偏移量加到Rn中,其
结果作为传送数据的存储器地址。若使用后缀
“!”,则结果写回到Rn中。Rn不允许是R15。
其中offset—Rn上的偏移量。
!:可选后缀,若有“!”,则将结果地址写回
到Rn,若Rn是R15,则不能够用后缀“!”。
LDRRd,[Rn,#offset]!((Rn)+offset))→Rd;(Rn)+offset→Rd;(3)程序相对偏移
LDR/STR{〈条件码〉}Rd??Label;(Label)→Rd
Label:程序相对偏移表达式,必须在当前指
令的±4kB范围内。
LDRRd,Label等价为:
LDRRd,[R15,Label-{pc}]
((R15)+Label-{pc}))→Rd;(4)后变址
LDR/STR{条件码}{B}{T}Rd,[Rn],offset
将Rn的值用作传送数据的存储器地址,数据传送后,偏移量加到Rn中,结果写回到Rn。
Rn不允许是R15。
LDRRd,[Rn],offset
;((Rn))→Rd,(Rn)+offset→Rn
;例1:将R0中的内容存放到外设中
LDRR1,UARTADD;将UART地址放进R1中
STRBR0,[R1];将数据放进外设中
……
UARTADD10000;UART的地址值;例2:
LDRR8,[R10];((R10))→R8
LDRNER2,