数据传送指令之:多寄存器Load/Store内存访问指令
5.4 多寄存器Load/Store内存访问指令
多寄存器Load/Store内存访问指令也叫批量加载/存储指令,它可以实现在一组寄存器和一块连续的内存单元之间传送数据。LDM用于加载多个寄存器,STM用于存储多个寄存器。多寄存器Load/Store内存访问指令允许一条指令传送16个寄存器的任何子集或所有寄存器。
多寄存器Load/Store内存访问指令主要用于现场保护、数据复制和参数传递等。
注意 | 多寄存器Load/Store内存访问指令会增加中断延时,因为ARM通常不会打断正在执行的指令去响应中断,而必须等到指令执行完。也就是说,如果一个中断在多寄存器Load/Store内存访问指令执行期间产生,那么处理器在多寄存器Load/Store内存访问指令执行完后才对中断响应。 |
表5.2总结了多寄存器Load/Store内存访问指令
表5.2 多寄存器Load/Store内存访问指令
指 令 | 作 用 | 操 作 |
LDM | 装载多个寄存器 | {Rd}*N←mem32[start address+4*N] |
STM | 保存多个寄存器 | {Rd}*N→mem32[start address+4*N] |
5.4.1 多寄存器内存字数据传送指令
1.LDM(1)指令
(1)指令编码格式
LDM(1)指令将数据从连续的内存单元中读取到指令中指定的寄存器列表中的各寄存器中。
当PC包含在LDM指令的寄存器列表中时,指令从内存中读取的字数据将被作为目标地址值,指令执行后程序将从目标地址处开始执行,从而实现了指令的跳转。
指令的编码格式如图5.15所示。
图5.15 LDM(1)指令编码格式
(2)指令的语法格式
LDM{cond>}addressing_mode> Rn>{!}, registers>
① cond>
为指令编码中的条件域。它指示LDM(1)指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。
② address_mode>
指令的寻址方式。确定编码格式中的P、U和W位。
③ Rn>
确定寻址模式所使用的基址寄存器。
如果r15作为指令的基址寄存器,指令的执行结果不可预知。
④ !
设置指令编码格式中的W位。它使指令执行后将操作数的内存地址写入基址寄存器Rn>中;如果!被忽略,W位为0,指令执行完后,不修改基址寄存器的值。
注意 | 如果基址寄存器包含在指令列表中,当指令执行完后,基址寄存器的值是新加载进的特定内存地址的值。也就是说,即使指令没有出现在指令列表中,基址寄存器的值也可能被修改。 |
⑤ registers>
被加载的寄存器列表。不同的寄存器之间用“,”隔开。完整的寄存器列表包含在“{}”中。编号低的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中高地址单元。
注意 | 无论寄存器在寄存器列表“{}”中如何排列,都将遵循上述规则。 |
寄存器r0~r15分别对应于指令编码中bit[0]~bit[15]位。如果Ri存在于寄存器列表中,则相应的位等于1,否则为0。
(3)指令操作的伪代码
指令操作伪代码如下面程序段所示。
If ConditionPass{cond} then
Address=start_address
For i=0 to 14
If register_list[i]==1 then
Ri=Memory[address,4]
Address=address+4
If register_list[15]==1 then
Value = Memory[address,4]
If(architecture version 5 or above) then
Pc= value AND 0xfffffffe
T bit=value[0]
Else
Pc= value AND 0xfffffffc
Address=address+4
Assert end_address=address+4
2.STM(1)指令
(1)指令编码格式
STM(1)指令将指令中寄存器列表中的各寄存器数值写入到连续的内存单元中。主要用于块数据的写入、数据栈操作以及进入子程序时保存相关寄存器的操作。
指令编码格式如图5.16所示。
图5.16 STM(1)指令编码格式
(2)指令的语法格式
STM{cond>}addressing_mode> Rn>{!}, registers>
① cond>
为指令编码中的条件域。它指示STM(1)指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。
② address_mode>
指令的寻址方式。确定编码格式中的P、U和W位。
③ Rn>
确定寻址模式所使用的基址寄存器。
如果r15作为指令的基址寄存器,指令的执行结果不可预知。
④ !
设置指令编码格式中的W位。它使指令执行后将操作数的内存地址写入基址寄存器Rn>中;如果!被忽略,W位为0,指令执行完后,不修改基址寄存器的值。
⑤ registers>
被加载的寄存器列表。不同的寄存器之间用“,”隔开。完整的寄存器列表包含在“{}”中。编号低的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中高地址单元。
寄存器r0~r15分别对应于指令编码中bit[0]~bit[15]位。如果Ri存在于寄存器列表中,则相应的位等于1,否则为0。
(3)指令操
数据传送指令 多寄存器 Load Store内存访问指令 微处理器 ARM 相关文章:
- 数据传送指令之:MOV指令(08-13)
- 数据传送指令之:MVN指令(08-13)
- 数据传送指令之:单数据交换指令(08-13)
- Thumb指令集之: 多寄存器数据传送指令(09-30)
- Thumb指令集之: 单寄存器数据传送指令(09-30)
- 数据传送指令之: 程序状态寄存器指令(09-13)