数据传送指令之:多寄存器Load/Store内存访问指令
作的伪代码
指令操作伪代码如下面程序段所示。
If ConditionPassed{cond} then
Address=Start_address
For i=0 to 15
If register_list[i]==1
Memory[address,4]=Ri
Address=address+4
Assert end_address==address-4
5.4.2 用户模式多寄存器内存字数据传送指令
1.LDM(2)指令
(1)指令编码格式
LDM(2)指令将数据从连续的内存单元中读取到指令中指定的寄存器列表中的各寄存器中。
注意 | 与LDM(1)指令不同,PC不能包含在寄存器列表中。 |
指令的编码格式如图5.17所示。
图5.17 LDM(2)指令编码格式
(2)指令的语法格式
LDM{cond>}addressing_mode> Rn>, registers_without_pc>ˆˆ
① cond>
为指令编码中的条件域。它指示LDM(2)指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。
② address_mode>
指令的寻址方式。确定编码格式中的P位和U位。此指令中W位指定为0。
③ Rn>
确定寻址模式所使用的基址寄存器。
如果r15作为指令的基址寄存器,指令的执行结果不可预知。
④ registers_without_pc>ˆ
被加载的寄存器列表。不同的寄存器之间用“,”隔开。完整的寄存器列表包含在“{}”中。此寄存器列表中不能包含PC寄存器。
如果PC包含在寄存器列表中,指令的执行结果不可预知。
其他细节可参考LDM(1)指令。
(3)指令操作的伪代码
指令操作伪代码如下面程序段所示。
If ConditionPassed{cond} then
Address=start_address
For i=0 to 14
If register_list[i]==1
Ri_usr=Memory[address,4]
Address=address+4
Assert end_address == address-4
2.STM(2)指令
(1)指令编码格式
STM(2)指令将指令中寄存器列表中的各寄存器数值写入到连续的内存单元中。主要用于块数据的写入、数据栈操作以及进入子程序时保存相关寄存器等操作。
指令编码格式如图5.18所示。
图5.18 STM(2)指令编码格式
(2)指令的语法格式
STM{cond>}addressing_mode> Rn>, registers >ˆ
① cond>
为指令编码中的条件域。它指示LDM(2)指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。
② address_mode>
指令的寻址方式。确定编码格式中的P位和U位。此指令中W位指定为0。
③ Rn>
确定寻址模式所使用的基址寄存器。
如果r15作为指令的基址寄存器,指令的执行结果不可预知。
④ registers >ˆ
寄存器列表。只能使用用户模式下的寄存器。
(3)指令操作的伪代码
指令操作伪代码如下面程序段所示。
If ConditionPassed{cond} then
Address=start_address
For i=0 to 15
If register_list[i] == 1
Memory[address,4]=Ri_usr
Address = address +4
Assert end_address == address-4
5.4.3 带状态寄存器的多寄存器内存字数据装载指令(LDM(3))
(1)指令编码格式
LDM(3)指令将数据从连续的内存单元中读取数据到寄存器列表中的各寄存器中。它同时将当前处理器模式对应的SPSR寄存器的内容复制到CPSR寄存器中。
当PC包含在LDM指令的寄存器列表中时,指令从内存中读取的数据将被作为目标地址值,指令执行后程序将从目标地址处开始执行,从而实现了指令的跳转。
在ARM v5及以上的版本和T系列的ARM v4版本中,SPSR寄存器的T位将复制到CPSR寄存器的T位,该位决定目标地址处的程序状态。在以前的版本中程序继续执行在ARM状态。
指令的编码格式如图5.19所示。
图5.19 LDM(3)指令编码格式
(2)指令的语法格式
LDM{cond>}addressing_mode> Rn>{!}, registers_and_pc>ˆ
① cond>
为指令编码中的条件域。它指示LDM(1)指令在什么条件下执行。当cond>忽略时,指令为无条件执行(cond=AL(Alway))。
② address_mode>
指令的寻址方式。确定编码格式中的P、U和W位。
③ Rn>
确定寻址模式所使用的基址寄存器。
如果r15作为指令的基址寄存器,指令的执行结果不可预知。
④ !
设置指令编码格式中的W位。它使指令执行后将操作数的内存地址写入基址寄存器Rn>中;如果!被忽略,W位为0,指令执行完后,不修改基址寄存器的值。
注意 | 如果基址寄存器包含在指令列表中,当指令执行完后,基址寄存器的值是新加载进的特定内存地址的值。也就是说,即使指令没有出现在指令列表中,基址寄存器的值也可能被修改。 |
⑤ registers_and_pc>ˆ
寄存器列表。
注意 | 在本格式的指令中寄存器列表中必须包含PC寄存器。 |
被加载的寄存器列表。不同的寄存器之间用“,”隔开。完整的寄存器列表包含在
数据传送指令 多寄存器 Load Store内存访问指令 微处理器 ARM 相关文章:
- 数据传送指令之:MOV指令(08-13)
- 数据传送指令之:MVN指令(08-13)
- 数据传送指令之:单数据交换指令(08-13)
- Thumb指令集之: 多寄存器数据传送指令(09-30)
- Thumb指令集之: 单寄存器数据传送指令(09-30)
- 数据传送指令之: 程序状态寄存器指令(09-13)