数据传送指令之:单寄存器的Load/Store指令
例
LDR r1,[r0,#0x12] ;将r0+12地址处的数据读出,保存到r1中(r0的值不变)
LDR r1,[r0] ;将r0地址处的数据读出,保存到r1中(零偏移)
LDR r1,[r0,r2] ;将r0+r2地址的数据读出,保存到r1中(r0的值不变)
LDR r1,[r0,r2,LSL #2] ;将r0+r2×4地址处的数据读出,保存到r1中(r0,r2的值不变)
LDR Rd,label ;label为程序标号,label必须是当前指令的±4KB范围内
LDR Rd,[Rn],#0x04 ;Rn的值用作传输数据的存储地址。在数据传送后,将偏移量0x04与
Rn相加,结果写回到Rn中。Rn不允许是r15
注意 | 地址对齐问题:大多数情况下,必须保证用于32位传送的地址是32位对齐的。 |
2.STR指令
(1)指令编码格式
STR指令用于将一个32位的字数据写入到指令中指定的内存单元。
指令的编码格式如图5.4所示。
图5.4 STR指令编码格式
(2)指令的语法格式
STR{cond>} Rd>,addr_mode>
① cond>
为指令编码中的条件域。它指示STR指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。
② Rd>
确定使用哪个通用寄存器作为目标寄存器。
③ addr_mode>
它确定了指令编码中的I、P、U、W、Rn和addr_mode>位。所有的寻址模式中,都会确定一个基址寄存器Rn。
(3)指令操作的伪代码
指令操作的伪代码如下面程序段所示。
If ConditionPassed{cond} then
Memory[address,4]=Rd
(4)指令举例
LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等等,若使用LDR指令加载数据到PC寄存器,则实现程序跳转功能,这样也就实现了程序散转。
① 变量访问
NumCount EQU 0x40003000 ;定义变量NumCount
LDR R0,=NumCount ;使用LDR伪指令装载NumCount的地址到R0
LDR R1,[R0] ;取出变量值
ADD R1,R1,#1 ;NumCount=NumCount+1
STR R1,[R0] ;保存变量
② GPIO设置
GPIO—BASE EQU 0xe0028000 ;定义GPIO寄存器的基地址
……
LDR R0,=GPIO—BASE
LDR R1,=0x00ffff00 ;将设置值放入寄存器
STR R1,[R0,#0x0C] ;IODIR=0x00ffff00,IOSET的地址为0xE0028004
③ 程序散转
…
MOV r2,r2,LSL #2 ;功能号乘以4,以便查表
LDR PC,[PC,r2] ;查表取得对应功能子程序地址,并跳转
NOP
FUN—TAB DCD FUN—SUB0
DCD FUN—SUB1
DCD FUN—SUB2
…
5.3.2 字节数据传送指令(LDRB/STRB)
1.LDRB指令
(1)指令编码格式
LDRB指令根据addr_mode>所确定的地址模式将一个8位字节读取到指令中的目标寄存器Rd>。
指令的编码格式如图5.5所示。
图5.5 LDRB指令编码格式
注意 | LDRB指令加载一个内存地址的8位字节到一个通用寄存器中。寄存器的高位数据补0。 |
(2)指令的语法格式
LDR{cond>}B Rd>,addr_mode>
① cond>
为指令编码中的条件域。它指示LDRB指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。
② Rd>
确定使用哪个通用寄存器作为目标寄存器。
③ addr_mode>
它确定了指令编码中的I、P、U、W、Rn和addr_mode>位。所有的寻址模式中,都会确定一个基址寄存器Rn。
(3)指令操作的伪代码
if ConditionPassed{cond} then
Rd = Memory[address,1]
注意 | 当PC作为位基地址出现在指令中时,指令中将会使用PC相关地址,使用这种方法可以编写自己的位置无关(position-independ)指令。 |
2.STRB指令
(1)指令编码格式
STRB指令从寄存器中取出指定的8位字节放入寄存器的低8位,并将寄存器的高位补0。
指令的编码格式如图5.6所示。
图5.6 STRB指令编码格式
(2)指令的语法格式
STR{cond>}B Rd>,addr_mode>
① cond>
为指令编码中的条件域。它指示STRB指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。
② Rd>
确定使用哪个通用寄存器作为目标寄存器。
注意 | 当PC作为目标寄存器Rd>出现在指令中时,指令的执行结果不可预知。 |
③ addr_mode>
它确定了指令编码中的I、P、U、W、Rn和addr_mode>位。所有的寻址模式中,都会确定一个基址寄存器Rn。
(3)指令操作的伪代码
if ConditionPassed{cond} then
Memory[address,1] = Rd[7:0]
5.3.3 半字数据传送指令(LDRH/STRH)
1.LDRH指令
(1)指令编码格式
LDRH指令用于从内存中将一个16位的半字读取到目标寄存器。
如果指令的内存地址不是半字节对齐的,指令的执行结果不可预知。
指令的编码格式如图5.7所示。
图5.7 LDRH指令的编码格式
(2)指令的语法格式
LDR{cond>}H Rd>,addr_mode>
①
数据传送指令 单寄存器 Load Store指令 微处理器 ARM 相关文章:
- 数据传送指令之:MOV指令(08-13)
- 数据传送指令之:MVN指令(08-13)
- 数据传送指令之:单数据交换指令(08-13)
- Thumb指令集之: 多寄存器数据传送指令(09-30)
- Thumb指令集之: 单寄存器数据传送指令(09-30)
- 数据传送指令之: 程序状态寄存器指令(09-13)