Thumb指令集之: 单寄存器数据传送指令
11.5单寄存器数据传送指令
Thumb指令集支持寄存器的装载和存储,即LDR和STR指令。8和类型的Load/Store指令在Thumb指令集中可用。这些指令使用两种寻址模式:寄存器偏移和立即数偏移。指令所能存取的数据包括字、半字和字节,同时半字和字节可以为有符号数或无符号数。
表11.4总结了Thumb状态下可用的数据传送指令。
表11.4 Thumb状态数据传送指令
助记符 | 说明 | 操作 |
LDR | 传送32位字到寄存器 | Rd-mem32[address] |
STR | 存储32位寄存器的值 | Rd->mem32[address] |
LDRB | 传送8位字节到寄存器 | Rd-mem8[address] |
STRB | 保存寄存器中的字节 | Rd->mem8[address] |
LDRH | 传送16位半字到寄存器 | Rd-mem16[address] |
STRH | 保存寄存器中的半字 | Rd->mem16[address] |
LDRSB | 装载有符号字节到寄存器 | Rd-sighExtend(mem8[address]) |
STRSB | 装载有符号半字到寄存器 | Rd-sighExtend(mem16[address]) |
Thumb数据传送指令的基本语法格式分为以下4种。
①opcode1>Rd>,[Rn>,#5_bit_offset>]
其中,opcode1>:=LDR|LDRH|LDRB|STR|STRH|STRB
②opcode2>Rd>,[Rn>,Rm>]
其中,opcode2>:=LDR|LDRH|LDRB|LSRSH|STR|STRH|STRB
③LDRRd>,[PC,8_bit_offset>]
④opcode3>Rd>,[SP,#8_bit_offset>]
其中,opcode3>:=LDR|STR
下面详细介绍各数据传送指令的语法和使用。
11.5.1寄存器装载指令LDR(1)
(1)编码格式
寄存器装载指令LDR(1)的编码格式如图11.42所示。
图11.42LDR(1)指令的编码格式
这种形式的LDR指令将32位内存数据装载到通用寄存器。常用于结构体的数据访问。域的基地址放在Rn寄存器中。
(2)指令的语法格式
LDRRd>,[Rn>,#immed_5>*4]
①Rd>
目的寄存器。用于存放从内存中取出的数据。
②Rn>
基址寄存器,用于存放所取数据的基地址。
③immed_5>
5位立即数。该立即数的4倍加上基址寄存器的值形成目标地址。
(3)指令操作的伪代码
Address=Rn+(immed_5*4)
Ifaddress[1:0]==0b00
Data=Memory[address,4]
Else
Data=UNPREDICTABLE
Rd=data
(4)对应的ARM指令
LDRRd>,[Rn>,#immed_5>*4]
注意 | 如果指令访问地址非字对齐,则指令的执行结果不可预知。 |
11.5.2寄存器装载指令LDR(2)
(1)编码格式
寄存器装载指令LDR(2)的编码格式如图11.43所示。
图11.43LDR(2)指令的编码格式
寄存器装载指令LDR(2)允许将一个32位内存数据装载到通用寄存器。此种形式的LDR指令常被用于访问数组中的元素。
(2)指令的语法格式
LDRRd>,[Rn>,Rm>]
①Rd>
目的寄存器。
②Rn>
寄存器存放内存访问基地址。
③Rm>
寄存器存放内存访问偏移地址。
(3)指令操作的伪代码
Address=Rn+Rm
Ifaddress[1:0]==0b00
Data=Memory[address,4]
Else
Data=UNPREDICTABLE
Rd=data
(4)对应的ARM指令
LDRRd>,[Rn>,Rm>]
11.5.3寄存器装载指令LDR(3)
(1)编码格式
寄存器装载指令LDR(3)的编码格式如图11.44所示。
图11.44LDR(3)指令的编码格式
寄存器装载指令LDR(3)允许将一个32位内存数据装载到通用寄存器。此种形式的LDR指令常被用于访问PC相关(PC-relative)数据。
(2)指令的语法格式
LDRRd>,[PC,#immed_8>*4]
①Rd>
目的寄存器。
②PC
程序指针寄存器,用于计算内存访问的地址。计算地址时,PC值的bit[1]被系统默认为0进行计算,所以产生的内存访问地址必为字对齐。
③immed_8>
8位立即数。该立即数的4倍将和PC值相加,形成内存访问地址。
(3)指令操作的伪代码
Address=(PC[31:2]2)+(immed_8*4)
Rd=Memory[address,4]
(4)对应的ARM指令
LDRRd>,[PC,#immed_8>*4]
11.5.4寄存器装载指令LDR(4)
(1)编码格式
寄存器装载指令LDR(4)的编码格式如图11.45所示。
图11.45LDR(4)指令的编码格式
寄存器装载指令LDR(4)允许将一个32位内存数据装载到通用寄存器。此种形式的LDR指令常被用于访问堆栈数据。
(2)指令的语法格式
LDRRd>,SP,#immed_8>*4]
①Rd>
目的寄存器。
②SP
堆栈指针寄存器,用于计算内存访问地址。
③immed_8>
8位立即数。该立即数的4倍将和SP值相加,形成内存访问地址。
(3)指令操作的伪代码
Address=SP+(immed_8*4)
Ifaddress[1:0]==0b00
Data=memory[address,4]
Else
Data=UNPREDICTABLE
Rd=data
(4)对应的ARM指令
LDRRd>,[SP,#immed_8>*4]
11.5.5字节加载指令LDRB(1)
(1)编码格式
字节加载指令LDRB(1)的编码格式如图11.46所示。
图11.46LDRB(1)指令的编码格式
LDRB(1)字节数据加载指令用于从内存中将一个8位的
Thumb指令集 单寄存器数据传送指令 ARM 寄存器装载指令 LDR(1) 相关文章:
- Thumb指令集之: Thumb指令的特点及实现(08-30)
- Thumb指令集之: Thumb跳转指令(08-30)
- Thumb指令集之: Thumb指令应用(08-30)
- Thumb指令集之: ARM和Thumb的混合编程(08-30)
- Thumb指令集与ARM指令集的区别(11-21)
- Thumb指令集之: Thumb指令应用(09-30)