一.ARM指令助记符格式
<opcode>{<cond>}{S} <Rd>,<Rn>,<op2>
1.{<cond>}
决定指令执行的条件域,即根据CPSR中的标志位的值执行指令CMP R0,R1
;R0与R1比较ADDHI R0,R0,#1
;若R0>R1,则R0=R0+1ADDLS R1,R1,#1
;若R0≤R1,则R1=R1+1

2.{S}
决定指令执行是否影响CPSR寄存器(程序状态寄存器)的值
以上两条可组成操作如:ADDEQS —-> <ADD>{<EQ>}{S}
3.<Rd>
目的寄存器
4.<Rn>
第一个操作数,为寄存器
5.<op2>
第二个操作数,具有如下形式:
(1) #immed_8r:常数表达式
(2) RM:寄存器方式
(3) RM,shift:寄存器移位方式
指令示例:ADDEQS R1,R2,#5
二.常用指令
1.MOV{<cond>}{S} <Rd>, <op1>
功能:Rd<-op1
MOV R0,#5 ;R0=5
MOV R0,R1 ;R0=R1
MOV R0,R1,LSL #5 ;R0=R1左移5位
2.MVN{<cond>}{S} <Rd>,<op1>
功能:Rd<-op1按位取反,即Rd=!op1
MVN R0,#0 ;R0=-1
3.ADD{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn+op2
ADD R0,R1,R2 ;R0=R1+R2
ADD R0,R1,R2,LSL #5 ;R0=R1+R2左移5位
4.ADC{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn+op2+carry,用于实现32位的数的加法
;第一个64位操作数存放在寄存器R3 R2内,
;第二个64位操作数存放在寄存器R5 R4内
;64位结果存放在R1 R0内
ADDS R0,R2,R4 ;低32位相加,S表示结果影响标志位的值
ADC R1,R3,R5 ;高32位相加
5.SUB{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn-op2
SUB R0,R1,#5 ;R0=R1-5
6.SBC{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn-op2-!carry,由于借位需清除进位标志,因此需要执行非操作
;第一个64位操作数存放在寄存器R3 R2内,
;第二个64位操作数存放在寄存器R5 R4内
;64位结果存放在R1 R0内
SUBS R0,R2,R4 ;低32位相减
SBC R1,R3,R5 ;高32位相减
7.RSB{<cond>}{S} <Rd>,<Rn>,<op2>
功能:同SUB指令,但倒换了两操作数的前后位置,即Rd<-op2-Rn
RSB R0,R1,#5 ;R0=5-R1
8.RSC{<cond>}{S} <Rd>,<Rn>,<op2>
功能:同SBC指令,但倒换了两操作数的前后位置,即Rd<-op2-Rn-!carry
;第一个64位操作数存放在寄存器R3 R2内,
;第二个64位操作数存放在寄存器R5 R4内
;64位结果存放在R1 R0内
SUBS R0,R4,R2 ;低32位相减
RSC R1,R5,R3 ;高32位相减
9.逻辑与/逻辑或/逻辑异或指令
AND{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn AND OP2ORR{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn OR op2EOR{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn EOR op2
AND R0,R0,#5
ORR R0,R0,#5
EOR R0,R0,#5
10. 位清除/乘法/乘加指令
- BIC 位清除指令
BIC{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn AND (!op2),用于清除Rn中的某些位并将结果放入目的寄存器Rd内
例:BIC R0,R0,#5 - MUL 32位乘法指令
MUL{<cond>}{S} <Rd>,<Rm>,<Rs>
功能:Rd<-Rm*Rs - MLA 32位乘加指令
MLA{<cond>}{S} <Rd>,<Rm>,<Rs>,<Rn>
功能:Rd<-Rm*Rs+Rn - SMULL 64位有符号数乘法指令
SMULL{<cond>}{S} <Rdl>,<Rdh>,<Rm>,<Rs>
功能:Rdh Rdl<-Rm*Rs,Rm、Rs为32位有符号数
例:
SMULL R0,R1,R2,R3
;R0=R2*R3的低32位
;R1=R2*R3的高32位 - SMLAL 64位有符号数乘加指令
SMALAL{<cond>}{S} <Rdl>,<Rdh>,<Rm>,<Rs>
功能:Rdh Rdl<-Rm*Rs+Rdh Rdl
例:
SMLAL R0,R1,R2,R3
;R0=R2*R3的低32位+R0
;R1=R2*R3的高32位+R1 - UMULL 64位无符号数乘法指令
类似SMULL - UMLAL 64位无符号数乘加指令
类似SMLAL
11.CMP{<cond>} <Rn>,<op2>
功能:进行Rn-op2的减法运算,由结果更新CPSR中标志位的值
CMP R0,#5
ADDGT R0,R0,#5 ;若R0>5则执行ADDGT指令
12.CMN{<cond>} <Rn>,<op2>
功能:同CMP指令,但Rn的值是和op2取负的值比较:Rn-(-op2)
CMN R0,#5 ;把R0与-5进行比较
13.TST{<cond>} <Rn>,<op2>
功能:Rn AND op2,检查寄存器Rn是否设置了op2中相应的位
TST R0,#5 ;测试R0中第0位与第2位是否为1
14.TEQ{<cond>} <Rn>,<op2>
功能:Rn EOR op2,检查寄存器Rn的值是否与op2相等
TEQ R0,#5 ;判断R0的值是否与5相等
15.分支指令
- B跳转指令(Branch)
B{<cond>} <target_address>
功能:PC<-PC+指令中24位有符号数左移两位,<target_address>是相对当前PC(寄存器R15)值的一个偏移量,为24为有符号数
目标地址:24位值有符号扩展为32位后左移两位(即乘4)+PC值
例1:
B exit ;程序跳转到标号exit处
…
exit
…
例2:执行10次循环
MOV R0,#10
loop
…
SUBS R0,#1
BNE loop ;若R0≠0,重复循环 - BL带返回的跳转指令(Branch with Link)
BL{<cond>} <target_address>
功能:子程序调用,在执行跳转的同时,还将子程序的返回地址保存到LR寄存器(R14)内
例1:调用子程序func
BL func
…
func
…
MOV R15,R14 ;子程序返回,R15:PC
例2:条件子程序调用
CMP R0,#5
BLLT SUB1
BLGE SUB2 ;若R0<5则调用SUB1,否则调用SUB2 - BX带状态切换的跳转指令
略 - BLX 带返回和状态切换的跳转指令
略
16.ARM存储器访问指令(寄存器与内存之间的数据传送 )
- LDR字数据加载指令
LDR{<cond>} <Rd>,<addr>
功能:(1)Rd<-addr所表示的内存地址内的字数据
(2)基址寄存器<-合成的有效地址
addr可取的值:
Rn:基址寄存器
Rm:变址寄存器
Index:偏移量,12位的无符号数

- LDRB 字节数据加载指令
LDR{<cond>}B <Rd>,<addr>
功能:类似LDR指令,偏移量为8位无符号数
(1)Rd<-addr地址内8位的字节数据
(2)Rd的高24位清0
例:LDRB R0,[R1] ;将内存中起始地址为R1的一个字节数据装入R0中 - LDRH 半字数据加载指令
- LDRT 用户模式的字数据加载指令
- LDRBT 用户模式的字节数据加载指令
- LDRSB 有符号的字节数据加载指令
- LDRSH 有符号的半字数据加载指令
- STR 字数据存储指令
STR{<cond>} <Rd>,<addr>
功能:(1)addr内存地址<-寄存器Rd字数据(32位)
(2)基址寄存器<-合成的有效地址
寻址方式与LDR指令
例:
R1=0x40003000 R0=0x1A27E4F3
STR R0, [R1, #4] !
(1)存储器地址=R1+#4=0x40003004
(2)R0→[0x40003004]= 0x1A27E4F3
(3)修改R1 R1+#4→ R1= 0x40003004 - STRB 字节数据存储指令
- STRH 半字数据存储指令
- STRT 用户模式的字数据存储指令
- STRBT 用户模式的字节数据存储指令
- LDM 批量数据加载指令
LDM{<cond>}{<type>} <Rn> {!},<regs> {^}
功能:连续存储单元的字数据→寄存器(多个)
数据单位:字
用途:一般用于数据块读出、数据出栈
格式说明:
1.type字段种类:8种。

- Rn:基址寄存器,其值是内存单元的起始地址。一般不使用为R15。
- Regs:寄存器列表,从最低序号寄存器开始处理,与书写顺序无关。
- !后缀:指令执行完毕后,将最后的地址写入基址寄存器。
- ^后缀:当regs中不包含PC时,该后缀用于指示指令所用的寄存器为用户模 式下的寄存器。否则,指示指令执行时,SPSR →CPSR。
- STM 批量数据存储指令
STM {<cond>}{<type>} <Rn> {!},<regs> {^}
功能:连续的内存单元←寄存器列表的值(字数据)
用途:一般用于数据块写入、数据的入栈。
Rn:基址寄存器,其值为内存单元的起始地址。
Regs:寄存器列表,包括所有当前模式下可见的寄存器。
其他参数用法同LDM指令。
例:
STMEA R13!,{R0-R12,PC}
;将寄存器R0~R12以及PC的值保存到R13指示的堆栈中
17.交换指令
- SWP 字数据交换指令
SWP {<cond>} <Rd>,<Rm>,[<Rn>]
功能:Rd = [Rn]
[Rn] = RM
例:SWP R0,R1,[R2]; R0<-[R2]字数据,[R2]<-R1字数据 - SWPB 字节数据交换指令
18.ARM软件中断指令
ARM处理器支持两条异常中断指令:
(1)软件中断指令SWI
(2)断点中断指令BKPT
19.程序状态寄存器指令(状态寄存器和通用寄存器间传送数据)
MRS{<cond>} <Rd>,CPSR
MRS{<cond>} <Rd>,SPSR
功能:CPSR/SPSR->Rd
例:MRS R0,CPSR; CPSR->R0MSR{<cond>} CPSR/SPSR_<field>,<op1>
功能:CPSR/SPSR_field<-op1
例:MSR CPRS_f,R0 ;R0->CPRS (只修改条件域)
MSR CPSR_fsxc,#5 ;#5->CPRS

Comment