数据传送指令之:单寄存器的Load/Store指令
5.3 单寄存器的Load/Store指令
Load/Store内存访问指令在ARM寄存器和存储器之间传送数据。ARM指令中有3种基本的数据传送指令。
① 单寄存器Load/Store指令(Single Register)
这些指令在ARM寄存器和存储器之间提供更灵活的单数据项传送方式。数据项可以是字节、16位半字或32位字。
② 多寄存器Load/Store内存访问指令
这些指令的灵活性比单寄存器传送指令差,但可以使大量的数据更有效地传送。它们用于进程的进入和退出、保存和恢复工作寄存器以及拷贝存储器中的一块数据。
③ 单寄存器交换指令(Single Register Swap)
这些指令允许寄存器和存储器中的数值进行交换,在一条指令中有效地完成Load/Store操作。它们在用户级编程中很少用到。它的主要用途是在多处理器系统中实现信号量(Semaphores)的操作,以保证不会同时访问公用的数据结构。
5.3.1 字数据传送指令
这种指令用于把单一的数据传入或者传出一个寄存器。支持的数据类型有字节(8位)、半字(16位)和字(32位)。
表5.1总结了所有单寄存器的Load/Store指令。
表5.1 单寄存器Load/Store指令
指 令 | 作 用 | 操 作 |
LDR | 把一个字装入一个寄存器 | Rd←mem32[address] |
STR | 将存储器中的字保存到寄存器 | Rd→mem32[address] |
LDRB | 把一个字节装入一个寄存器 | Rd←mem8[address] |
STRB | 将寄存器中的低8位字节保存到存储器 | Rd→mem8[address] |
LDRH | 把一个半字装入一个寄存器 | Rd←mem16[address] |
STRH | 将寄存器中的低16位半字保存到存储器 | Rd→mem16[address] |
LDRBT | 用户模式下将一个字节装入寄存器 | Rd←mem8[address] under user mode |
STRBT | 用户模式下将寄存器中的低8位字节保存到存储器 | Rd→mem8[address] under user mode |
LDRT | 用户模式下把一个字装入一个寄存器 | Rd←mem32[address]under user mode |
STRT | 用户模式下将存储器中的字保存到寄存器 | Rd→mem32[address] ]under user mode |
LDRSB | 把一个有符号字节装入一个寄存器 | Rd←sign{mem8[address]} |
LDRSH | 把一个有符号半字装入一个寄存器 | Rd←sign{mem16[address]} |
1.LDR指令
(1)指令编码格式
LDR指令用于从内存中将一个32位的字读取到目标寄存器。
指令的编码格式如图5.3所示。
图5.3 LDR指令编码格式
LDR指令根据addr_mode>所确定的地址模式将一个32位字读取到指令中的目标寄存器Rd>。如果指令中的寻址方式确定的地址不是字对齐的,则读出的数值要进行循环右移。所移位数为寻址方式确定的地址bits[1∶0]8的倍,也就是说处理器将取到的数值作为字的最低位处理。
如果设置了L位,则进行装载,否则进行存储。
如果设置了P位,则使用预先变址寻址,否则使用过后变址寻址。
如果设置了U位,则给出的偏移量被加到基址寄存器上,否则从中减去偏移量。
如果设置了B位,传送内存的一个字节,否则传送一个字。这在助记符末尾添加后缀“B”,如MOV r7,r5变为MOVB r7,r5。
W位的解释依赖于使用的地址模式。
· 对于预先变址寻址,设置W位强制把它用做地址转换的最终地址写回基址寄存器中(例如,传送的副作用是Rn:= Rn +/-offset。这在汇编器中表示为给指令加上后缀“!”。)。
· 对于过后变址寻址,地址总是写回,设置 W 位指示在进行传送之前强制地址转换。这在汇编器中表示为给指令加上后缀“T”。
当PC作为LDR的目的寄存器Rd>时,从存储器取得的数据将被当作目标地址值,程序将跳转到目标地址开始执行。
(2)指令的语法格式
LDR{cond>} Rd>,addr_mode>
① cond>
为指令编码中的条件域。它指示LDR指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。
② Rd>
确定使用哪个通用寄存器作为目标寄存器。
③ addr_mode>
它确定了指令编码中的I、P、U、W、Rn和addr_mode>位。所有的寻址模式中,都会确定一个基址寄存器Rn。
(3)指令操作的伪代码
指令操作的伪代码如下面程序段所示。
If ConditionPassed{cond} then
If address[1:0] == 0b00 then
Value = Memory[address,4]
Else if address[1:0] == 0b01 then
Value = Memory[address,4] Rotate_Right 8
Else if address[1:0] == 0b10 then
Value = Memory[address,4] Rotate_Right 16
Eles /* address[1:0] == 0b11*/
Value = Memory[address,4] Rotate_Right 24
If (Rd is R15) then
If (architecture version 5 or above) then
PC = value AND 0xfffffffe
T Bit = value[0]
Else
PC = value AND 0xfffffffc
Else
Rd = value
(4)指令举
数据传送指令 单寄存器 Load Store指令 微处理器 ARM 相关文章:
- 数据传送指令之:MOV指令(08-13)
- 数据传送指令之:MVN指令(08-13)
- 数据传送指令之:单数据交换指令(08-13)
- Thumb指令集之: 多寄存器数据传送指令(09-30)
- Thumb指令集之: 单寄存器数据传送指令(09-30)
- 数据传送指令之: 程序状态寄存器指令(09-13)