ARM的Load/Store指令

ARM 196浏览

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{<cond>} {B} Rd,Rm,[Rn]

字数据交换(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的二进制编码如下:


其汇编格式如下:
 MRS{<cond>} Rd,CPSR|SPSR 
 

MSR的二进制编码如下:


其汇编格式如下:
 MSR{<cond>} CPSR_f | SPSR_f,#<32-bit immediate>
 MSR{<cond>} CPSR_<field> | SPSR_<field>,Rm

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)。
二进制编码如下:


汇编格式如下:
B{L}{<cond>} <target address>


BX BLX指令用于支持Thumb(16位)指令集的ARM芯片,程序可以通过这些指令完成处理器从ARM状态到Thumb状态的切换。类似的Thumb指令可以使处理器切换回32位ARM指令。 二进制编码如下:


汇编格式如下:
 1: B{L}X{<cond>} Rm
 2: BLX <target address>

 

转自:http://00923.blog.sohu.com/17983429.html