数据传送指令之:多寄存器Load/Store内存访问指令
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寄存器。 |
被加载的寄存器列表。不同的寄存器之间用“,”隔开。完整的寄存器列表包含在“{}”中。编号低的寄存器对应于内存中的低地址单元,编号高的寄存器对应于内存中的高地址单元。
寄存器r0~r15分别对应于指令编码中bit[0]~bit[15]位。如果Ri存在于寄存器列表中,则相应的位等于1,否则为0。
该指令执行时将当前处理器模式下的SPSR值复制到CPSR中。指令的其他参数可参见LDM(1)指令格式。
(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
CPSR=SPSR
Value=memory[address,4]
If {architecture version 4T, 5 or above} and {T bit ==1} then
Else
Pc=value AND oxfffffffc
Address=address + 4
Assert end_address=address-4
评论