LDR 指令
LDR 指令的格式为:
LDR{条件} 目的寄存器,<存储器地址>
LDR 指令用于从存储器中将一个32 位的字数据传送到目的寄存器中。该指令通常用于从存储器
中读取32 位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC 作为目的寄存器时,
指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
指令示例:
LDR R0,[R1] ;将存储器地址为R1 的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2 的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8 的字数据读入寄存器R0。
LDR R0,[R1,R2] ! ;将存储器地址为R1+R2 的字数据读入寄存器R0,并将新地址R1
+R2 写入R1。
LDR R0,[R1,#8] ! ;将存储器地址为R1+8 的字数据读入寄存器R0,并将新地址R1
+8 写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+
R2 写入R1。
LDR R0,[R1,R2,LSL#2]! ;将存储器地址为 R1+R2×4 的字数据读入寄存器R0,并将新地
址R1+R2×4 写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+
R2×4 写入R1。
STR 指令
STR 指令的格式为:
STR{条件} 源寄存器,<存储器地址>
STR 指令用于从源寄存器中将一个32 位的字数据传送到存储器中。该指令在程序设计中比较常
用,且寻址方式灵活多样,使用方式可参考指令LDR。
指令示例:
STR R0,[R1],#8 ;将R0 中的字数据写入以R1 为地址的存储器中,并将新地址R1+8 写入R1。
STR R0,[R1,#8] ;将R0 中的字数据写入以R1+8 为地址的存储器中。
BL 指令
BL 指令的格式为:
BL{条件} 目标地址
BL是一个跳转指令,但跳转之前,会在寄存器R14 中保存PC 的当前内容,因此,可以通过将R14 的内容重新加载到PC 中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。
指令示例:
BL Label ;当程序无条件跳转到标号Label 处执行时,同时将当前的PC 值保存到R14 中
MOV 指令
MOV 指令的格式为:
MOV{条件}{S} 目的寄存器,源操作数
MOV 指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S
选项决定指令的操作是否影响CPSR 中条件标志位的值,当没有S 时指令不更新CPSR 中条件标志位
的值。
指令示例:
MOV R1,R0 ;将寄存器R0 的值传送到寄存器R1
MOV PC,R14 ;将寄存器R14 的值传送到PC,常用于子程序返回
MOV R1,R0,LSL#3 ;将寄存器R0 的值左移3 位后传送到R1
CMP 指令
CMP 指令的格式为:
CMP{条件} 操作数1,操作数2
CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR 中
条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是
操作数1 与操作数2 的关系(大、小、相等),例如,当操作数1 大于操作操作数2,则此后的有GT
后缀的指令将可以执行。
指令示例:
CMP R1,R0 ;将寄存器R1 的值与寄存器R0 的值相减,并根据结果设置CPSR 的标志位
CMP R1,#100 ;将寄存器R1 的值与立即数100 相减,并根据结果设置CPSR 的标志位
TST 指令
TST 指令的格式为:
TST{条件} 操作数1,操作数2
TST 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运
算结果更新CPSR 中条件标志位的值。操作数1 是要测试的数据,而操作数2 是一个位掩码,该指
令一般用来检测是否设置了特定的位。
指令示例:
TST R1,#%1 ;用于测试在寄存器R1 中是否设置了最低位(%表示二进制数)
TST R1,#0xffe ;将寄存器R1 的值与立即数0xffe 按位与,并根据结果设置CPSR 的标志位
ADD 指令
ADD 指令的格式为:
ADD{条件}{S} 目的寄存器,操作数1,操作数2
ADD 指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1 应是一个寄存器,操
作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。
指令示例:
ADD R0,R1,R2 ; R0 = R1 + R2
ADD R0,R1,#256 ; R0 = R1 + 256
ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1)
SUB 指令
SUB 指令的格式为:
ARM 应用系统开发详解──基于S3C4510B 的系统设计29
SUB{条件}{S} 目的寄存器,操作数1,操作数2
SUB 指令用于把操作数1 减去操作数2,并将结果存放到目的寄存器中。操作数1 应是一个寄存
器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符
号数的减法运算。
指令示例:
SUB R0,R1,R2 ; R0 = R1 - R2
SUB R0,R1,#256 ; R0 = R1 - 256
SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1)
AND 指令
AND 指令的格式为:
AND{条件}{S} 目的寄存器,操作数1,操作数2
AND 指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数1 应是一
个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于屏蔽操作
数1 的某些位。
指令示例:
AND R0,R0,#3 ; 该指令保持 R0 的0、1 位,其余位清零。
ORR 指令
ORR 指令的格式为:
ORR{条件}{S} 目的寄存器,操作数1,操作数2
ARM 应用系统开发详解──基于S3C4510B 的系统设计30
ORR 指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1
应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设
置操作数1 的某些位。
指令示例:
ORR R0,R0,#3 ; 该指令设置 R0 的0、1 位,其余位保持不变。
BIC 指令
BIC 指令的格式为:
BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC 指令用于清除操作数1 的某些位,并把结果放置到目的寄存器中。操作数1 应是一个寄存器,
操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。操作数2 为32 位的掩码,如果在
掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。
指令示例:
BIC R0,R0,#%1011 ; 该指令清除 R0 中的位 0、1、和 3,其余的位保持不变。
MRS 指令
MRS 指令的格式为:
MRS{条件} 通用寄存器,程序状态寄存器(CPSR 或SPSR)
MRS 指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下几种情况:
- 当需要改变程序状态寄存器的内容时,可用MRS 将程序状态寄存器的内容读入通用寄存
器,修改后再写回程序状态寄存器。
- 当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态
寄存器的值,然后保存。
指令示例:
MRS R0,CPSR ;传送 CPSR 的内容到R0
MRS R0,SPSR ;传送 SPSR 的内容到R0
MSR 指令
MSR 指令的格式为:
MSR{条件} 程序状态寄存器(CPSR 或SPSR)_<域>,操作数
MSR 指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存
器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32 位的程序状态寄存器可分为4 个域:
位[31:24]为条件标志位域,用f 表示;
位[23:16]为状态位域,用s 表示;
位[15:8]为扩展位域,用x 表示;
位[7:0]为控制位域,用c 表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR 指令中指明将要
操作的域。
指令示例:
MSR CPSR,R0 ;传送 R0 的内容到CPSR
MSR SPSR,R0 ;传送 R0 的内容到SPSR
MSR CPSR_c,R0 ;传送R0 的内容到SPSR,但仅仅修改CPSR 中的控制位域
LDM(或STM)指令
LDM(或STM)指令的格式为:
LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{∧}
LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄
存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,{类型}为以下几
种情况:
IA 每次传送后地址加1;
IB 每次传送前地址加1;
DA 每次传送后地址减1;
DB 每次传送前地址减1;
FD 满递减堆栈;
ED 空递减堆栈;
FA 满递增堆栈;
EA 空递增堆栈;
{!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否
则基址寄存器的内容不改变。
基址寄存器不允许为R15,寄存器列表可以为R0~R15 的任意组合。
{∧}为可选后缀,当指令为LDM 且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据
传送之外,还将SPSR 复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而
不是当前模式下的寄存器。
指令示例:
STMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0,R4 到R12,LR)存入堆栈。
LDMFD R13!,{R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0,R4 到R12,LR)。