ARM的数据存取指令Load/Store是唯一用于寄存器和存储器之间进行数据传送的指令。ARM指令集中有三种基本的数据存取指令:
1 单寄存器的存取指令(LDR,STR)
2 多寄存器存取指令(LDM,STM)
3 单寄存器交换指令(SWP)
具体可以演化成:
LDR 字数据加载指令
LDRB 字节数据加载指令
LDRSB 有符号字节数据加载指令
LDRH 半字数据加载指令
LDRSH 有符号半字数数据加载指令
STR 字数据存储指令
STRB 字节数据存储指令
STRH 半字数据存储指令
LDM/STM 批量数据加载/存储指令
SWP/SWPB 数据交换指令
编码格式如下:
二进制编码如下:
多寄存器存取的二进制编码:
批量数据加载/存储指令(LDM, STM)
LDM或(STM){条件}{类型} 基址寄存器{!},寄存器列表{^}
{!}选项
若选择此项,则当数据传送完毕后,将最后的地址写入到基址寄存器,否则基址寄存器内容不变。
{^}选项
当命令为LDM,且寄存器列表包含R15,选用此后缀时表示:除了正常数据传送之外,还将SPSP复制到CPSR。同时此后缀还表示传入传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
存储器与寄存器交换指令swp
汇编格式:
SWP{
字数据交换(SWP)/字节数据交换(SWPB):在寄存器和外部存储器之间交换字节或字
SWP指令:
SWP{条件} 目的寄存器,源寄存器1,[源寄存器2]
指令示例:
SWP R0,R1,[R2] ;将R2所指向的存储器中的字数据传送到R0,同时将
;R1中的字数据传送到R2所指向的存储单元
SWP R0,R0,[R1] ;将R1所指向的存储器中的字数据与R0中的字数据交换
SWPB指令:
SWP{条件}B 目的寄存器,源寄存器1,[源寄存器2]
指令示例:
SWPB R0,R1,[R2] ;将R2所指向的存储器中的字节数据传送到R0,
;R0的高24位清零,
;同时将R1中的低8位数据传送到R2所指向的存储单元
SWPB R0,R0,[R1] ;将R1所指向的存储器中的字节数据与R0中的低8位数据交换
程序状态寄存器与通用寄存器之间的传送指令PSR指令:
ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。 这两条指令分别是:
状态寄存器到通用寄存器的传送指令(MRS)
通用寄存器到状态寄存器的传送指令(MSR)
MRS的二进制编码如下:
MSR的二进制编码如下:
其汇编格式如下:
MSR{
MSR{
MRS指令
MRS {条件} 通用寄存器,程序状态寄存器(CPSR or SPSR)
示例:
MRS R0,CPSR ;传送CPSR的内容到R0
MRS R0,SPSR ;传送SPSR的内容到R0
MSR指令
MSR{条件} 程序状态寄存器(CPSR or SPSR)_<域>,通用寄存器
32位程序状态寄存器可分为4个域:
位[31:24]为条件标志域,用f表示;
位[23:16]为状态位域,用s表示;
位[15:8]为扩展位域,用x表示;
位[7:0]为控制位域,用c表示;
示例:
MSR CPSR_cxsf,R0 ;传送R0的内容到CPSR
MSR CPSR_f,#&F0000000 ;设置所有标志位
MSR CPSR_c,R0 ;传送R0的内容到CPSR,但仅修改CPSR中的控制位域
转移指令:
ARM的转移指令可以从当前指令向前或向后的32MB的地址空间跳转,根据完成的功能它可以分为以下4种 :
B 转移指令
BL 带链接的转移指令 (可以回转)
BX 带状态切换的转移指令 (ARM和Thumb之间的转换)
BLX 带链接和状态切换的转移指令
转移指令B在程序中完成简单的跳转指令,可以跳转到指令中指定的目的地址。BL指令完全象转移指令一样地执行转移,同时把转移后面紧接的一条指令的地址保存到链接寄存器LR(R14)。
二进制编码如下:
BX BLX指令用于支持Thumb(16位)指令集的ARM芯片,程序可以通过这些指令完成处理器从ARM状态到Thumb状态的切换。类似的Thumb指令可以使处理器切换回32位ARM指令。 二进制编码如下:
转自:http://00923.blog.sohu.com/17983429.html