|
ARM指令---批量load/store 内存访问指令(LDM和STM)
LDM(3) 带状态寄存器的批量内存字数据读取指令
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、LDM(1)
格式:LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>
! --- 使指令执行后将操作数的内存地址写入基址寄存器中( 回写)
<registers list> ----寄存器列表;寄存器列表中的寄存器和内存单元必须满足的规则:编号低的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中高地址单元。
当 PC 包含在 寄存器列表 中时,指令从内存中读取的字数据将被当作目标地址值,指令执行后程序将从目标地址初开始执行,即实现了跳转操作。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2、LDM(2) ( 用户模式的批量内存字数据读取指令 )
格式:LDM{<COND>}<addressing_mode> <Rn>, <registers_without_pc>^
注1:PC 寄存器不能包含在 LDM 指令的寄存器列表中!
注2:当在特权级的处理器模式下使用本指令时,内存系统将该操作当作一般用户模式下的内存访问操作。
注3:指令中有 ^ 存在,但指令列表中不含有 PC,则指示指令中所用的寄存器为用户模式下的寄存器的寄存器!
注4:用户模式和系统模式下不能使用此指令,否则产生不可预知结果。
注5:指令中的基址寄存器是指令执行时的当前处理器模式对应的物理寄存器,而不是用户模式对应的寄存器。
注6:异常中断程序是在特权级的处理器模式下执行的,这时如果需要按照用户模式的权限访问内存,可以用使用 LDM(2) 指令。
注7:本指令后面不能紧跟访问备份寄存器指令,最好跟一条 NOP 指令。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3、LDM(3) ( 带状态寄存器的批量内存字数据读取指令)
格式:LDM{<COND>}<addressing_mode> <Rn>{!}, <registers_with_pc>^
此指令除了将内存单元的内容读取到寄存器列表中的各寄存器,同时还将当前处理器模式对应的 SPSR 寄存器的内容复制到 CPSR 寄存器中。
注:寄存器列表中必须包含 PC,其实这也是区分 LDM 几个形式的依据之一(还有一个是 " ! " 号,LDM(2) 是没有这个号的)。
列表中有 PC 且带有 ^ 号,所以此 LDM 指令为 LDM(3),此时也是指示要将当前处理器模式下的 SPSR 值复制到 CPSR 中。自然的,不包含 PC 时,就是 LDM(2) 号指令了。
本指令主要用于从异常模式下返回,如果在用户模式或系统模式下使用该指令,会产生不可预知的结果!
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4、STM(1)
格式:STM{<cond>}<addressing_mode> <Rn>{!}, <registers>
注:R15 不能作为 Rn!
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5、STM(2) ( 用户模式的批量内存字数据写入指令)
格式:STM{<cond>}<addressing_mode> <Rn>, <registers>^
^ 指示指令中所使用的寄存器为用户模式对应的寄存器。 |
|