一、ARM处理器寻址方式
寻址名称指令格式举例指令说明备注
立即寻址SUBS R0,R0,#1 R0减1,结果放入R0,并
且影响标志位立即数要以“#”号为前缀,“0x”表示16进制数值
MOV R0,#0xFF000 将立即数0xFF000装入R0
寄存器中
寄存器寻址MOV R1,R2 将R2的值存入R1 操作数的值在寄存器
中
SUB R0,R1,R2 将R1的值减去R2的值,
果保存到R0中
寄存器移位寻址MOV R0,R2,LSL#3 R2的值左移3位,结果放入R0,即时R0=R2*8 ANDS R1,R1,R2,LSL R3 R2的值左移R3位,然后和R1相与,结果放入R1 可采
取的
移位
操作
LSL 逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0
LSR 逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0
ASR 算数右移(Arithmetic Shift Right),移位过程中保持符号位不变,即若源操作数为正数,则字的高端空出的位补0,否则补1。
ROR 循环右移(Rotate Right),由字的低端移出的位填入字的高端空出位.
RRX 带扩展的循环右移(Rotate Right eXtended by 1 place),操作数右移一位,高端空出的位用原C标志值填充。
寄存器间接寻址LDR R1,[R2] 将R2指向的存储单元的数
据读出,保存在R1中
即寄存器为操作数的
地址指针。
SWP R1,R1,[R2] 将寄存器R1的值和R2指
定的存储单元的内容交换
多寄存器寻址LDMIA R1!,{R2--R7,R12} 将R1指向的单元中的数据
读出到寄存器R2~R7、R12
中(R1自动加1)
使用多寄存器寻址指
令时,寄存器子集的
顺序是由小到大的顺
序排列,连续的寄存
器可用“--”连接,否
则用“,”分隔书写。STMIA R0!,{R2--R7,R12} 将寄存器R2~R7、R12的
值保存到R0指向的存储单
元中(R0自动加1)
块拷贝寻址STMIA R0!,{R1-R7} 将R1~R7的数据保存到存储器中。存
储指针在保存第一个值之后增加,增
长方向为向上增长
块拷贝寻
址指令用
于将一块
数据从存
储器的某
一位置拷
贝到令一
位置STMIB R0!,{R1-R7} 将R1~R7的数据保存到存储器中。存
储指针在保存第一个值之前增加,增
长方向为向上增长
STMDA R0!,{R1-R7} 将R1~R7的数据保存到存储器中。存
储指针在保存第一个值之后增加,增
长方向为向下增长
STMDB R0!,{R1-R7} 将R1~R7的数据保存到存储器中。存
储指针在保存第一个值之前增加,增
长方向为向下增长
堆栈寻址 STMFD SP!,{R1-R7,LR}
将R1~R7、LR 入栈。满递减堆栈。 堆栈是一种按特定顺序进行存取的存储区,操作顺序分为“后进先出”或“先进后出”。存储器堆栈分为两种:1、向上生长:向高地址方向生长,称为递增堆栈;2、向下生长:向低地址方向生长,称为递减堆栈。
LDMFD SP!,{R1-R7,LR} 数据出栈,放入R1~R7、LR 寄存器。满递减堆栈
堆栈类
型 FA(满递增) 堆栈通过增大存储器的地址向上增长,堆栈
指针指向内含有效数据项的最高地址。指令如LDMFA 、STMFA 等。
EA(空递增)
堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA 、STMEA 等。
FD(满递减) 堆栈通过减小存储器的地址向下增长,堆栈
指针指向内含有效数据项的最低地址。指令如LDMFD 、STMFD 等。 ED(空递减) 堆栈通过减小存储器的地址向下增长,堆栈
指针指向堆栈下的第一个空位置。指令如LDMED 、STMED 等
基址寻址 LDR R2,[R3,#0x0C]
读取R3+0x0C 地址上的存储单元的内容,存入R2
基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。 STR R1,[R0,#-4] 先R0=R0-4,然后把R1的值保存到R0指定的存储单元
LDR R1,[R0,R3,LSL#1]
将R0+R3*2地址上的存储单元的内容读出,存入R1
相对寻址 BL SUBR1 ;调用到SUBR1子程序
BEQ LOOP ;条件跳转到LOOP 标号处
……
LOOP: MOV R6,#1 …… SUBR1: …… 相对寻址是基址寻址的一种变通。
操作数的有效地址=基准地址+偏移量
二、ARM 指令集
1、指令格式
ARM 指令的基本格式:
第2个操作数的三种使用形式如下表:
#immed_8r —常数表达式
该常数必须对应8位位图,
即常数是一个8位的常数循环移位偶数位得到。例:合法常量:0x3FC(0xFF<<2)、0、0xF0000000(0xF0<<24) 非法常量;0x1FE 、511、0xFFFF 等。指令;AND R1,R2,#0x0F Rm —寄存
器方式
在寄存器方式下,操作数即为寄存器的数值。应用指令举例: SUB R1,R1,R2 MOV PC,R0 Rm,shift —寄
存器移位方式 将寄存器的移位结果作为操作数,但Rm 的值保持不变。移位方法如下: LSL #n 逻辑左移n 位(1≤n ≤31)
LSR #n 逻辑右移n 位(1≤n ≤32) ASR #n 算术右移n 位(1≤n ≤32) ROR #n 循环右移n 位(1≤n ≤31) RRX 带扩展的循环右移1位
type Rs
Type 为LSL 、LSR 、ASR 和ROR 中的一种;Rs 偏移
量寄存器,低8位有效。若其值≥32,则第2个操作数的结果为0(ARS 、ROR 例外)。
例如:ADD R1,R1,R1,LSL#3 ;R1=R1*9
R15为处理器的程序计数器PC ,一般不要对其进行操作,而且有些指令不允许使用R15的,如UMULL 指令。
2、条件码:使用指令条件码可实现高效的逻辑操作,提高代码效率。指令条件码表如下: 操作码 条件码助记符 标志 含义 0000 EQ Z=1 相等 0001 NE Z=0 不想等 0010 CS/HS C=1 无符号数大于或等于 0011 CC/LO C=0 无符号数小于 0100 MI N=1 负数 0101 PL N=0 正数或零 0110 VS V=1 溢出 0111 VC V=0 没有溢出 1000 HI C=1,Z=0 无符号数大于
opcode 指令助记符,如LDR 、STR 等 cond 执行条件,如EQ 、NE 等 S 是否影响CPSR 寄存器的值,书写时影响CPSR Rd 目标寄存器 Rn 第1个操作数的寄存器
operand 2 第2个操作数
1001 LS C=0,Z=1 无符号数小于或等于
1010 GE N=V 有符号数大于或等于
1011 LT N!=V 有符号数小于
1100 GT Z=0,N=V 有符号数大于
1101 LE Z=1,N!=V 有符号数小于或等于
1110 AL 任何无条件执行(指令默认条件)1111 NV 任何从不执行(不要使用)
对于Thumb指令集,只有B指令具有条件码执行功能,此指令的条件码同上表。如果为无条件执行时,条件码助记符AL不能在指令中书写。
条件码应用举例CMP R0,R1 R0和R1比较
ADDHI R0,R0,#1 若R0>R1,则R0=R0+1
3、ARM存储器访问指令
ARM存储器访问指令表如下:
助记符说明操作条件码位置LDR Rd,addressing 加载字数据Rd←[addressing], addressing索引LDR{cond} LDRB Rd,addressing 加载无符号字节数据Rd←[addressing], addressing索引LDR{cond}B LDRT Rd,addressing 以用户模式加载字数据Rd←[addressing], addressing索引LDR{cond}T LDRBT Rd,addressing 以用户模式加载无符号字节数据Rd←[addressing], addressing索引LDR{cond}BT LDRH Rd,addressing 加载无符号半字数据Rd←[addressing], addressing索引LDR{cond}H LDRSB Rd,addressing 加载有符号字节数据Rd←[addressing], addressing索引LDR{cond}SB LDRSH Rd,addressing 加载有符号半字数据Rd←[addressing], addressing索引LDR{cond}SH STR Rd,addressing 存储字数据[addressing]←Rd, addressing索引STR{cond} STRB Rd,addressing 存储字节数据[addressing]←Rd, addressing索引STR{cond}B STRT Rd,addressing 以用户模式存储字数据[addressing]←Rd, addressing索引STR{cond}T STRBT Rd,addressing 以用户模式存储字节数据[addressing]←Rd, addressing索引STR{cond}BT STRH Rd,addressing 存储半字数据[addressing]←Rd, addressing索引STR{cond}H LDM{mode} Rn{!},reglist 多寄存器加载reglist←[Rn....],Rn回写等LDM{cond}{mode} STM{mode} Rn{!},reglist 多寄存器存储[Rn....]←reglist,Rn回写等STM{cond}{mode} SWP Rd,Rm,Rn 寄存器和存储器字数据交换Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond} SWPB Rd,Rm,Rn 寄存器和存储器字节数据交换Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}B LDM、STM的主要用途是现场保护、数据复制、参数传送等。其模式有如下8种。
1 IA 每次传送后地址加4 用于
数据
块传
输多寄存器传送指令映射
2 IB 每次传送前地址加4 向上生长向下生长
3 DA 每次传送后地址减
4 满空满空
4 DB 每次传送前地址减4 增
加之前STMIB、STMFA LDMIB、LDMED
5 FD 满递减堆栈用于
堆栈
操作之后STMIA、STMEA LDMIA、LDMFD
6 ED 空递减堆栈减
少之前LDMDB、LDMEA STMDB、STMFD
7 FA 满递增堆栈之后LDMDA、LDMFA STMDA、STMED
8 EA 空递增堆栈
4、ARM数据处理指令
数据处理指令大致可分为3类:数据传送指令、算术逻辑运算指令和比较指令。数据处理指令只能对寄存器的内容进行操作。所有ARM数据处理指令
均可选择使用S后缀,并影响状态标志。比较指令CMP、CMN、TST和TEQ
不需要后缀S,它们会直接影响状态标志。ARM数据处理指令表如下所示:
助记符说明操作条件码位置MOV Rd,operand2 数据传送Rd←operand2 MOV{cond}{S} MVN Rd,operand2 数据非传送Rd←(~operand2) MVN{cond}{S} ADD Rd,Rn,operand2 加法运算指令Rd←Rn+operand2 ADD{cond}{S} ADC Rd,Rn,operand2 带进位加法Rd←Rn+operand2+Carry ADC{cond}{S} SUB Rd,Rn,operand2 减法运算指令Rd←Rn-operand2 SUB{cond}{S} SBC Rd,Rn,operand2 带进位减法指令Rd←Rn-operand2-(NOT)Carry SBC{cond}{S} RSB Rd,Rn,operand2 逆向减法指令Rd←operand2-Rn RSB{cond}{S} RSC Rd,Rn,operand2 带进位逆向减法指令Rd←operand2-Rn-(NOT)Carry RSC{cond}{S} AND Rd,Rn,operand2 逻辑与操作指令Rd←Rn&operand2 AND{cond}{S} ORR Rd,Rn,operand2 逻辑或操作指令Rd←Rn | operand2 ORR{cond}{S} EOR Rd,Rn,operand2 逻辑异或操作指令Rd←Rn^operand2 EOR{cond}{S}
BIC Rd,Rn,operand2 位清除指令Rd←Rn&(~operand2) BIC{cond}{S} CMP Rn,operand2 比较指令标志N、Z、C、V←Rn-operand2 CMP{cond}
CMN Rd,operand2 负数比较指令标志N、Z、C、V←Rn+operand2 CMN{cond}
TST Rd,operand2 位测试指令标志N、Z、C、V←Rn&operand2 TST{cond}
TEQ Rd,operand2 相等测试指令标志N、Z、C、V←Rn^operand2 TEQ{cond}
ARM数据处理指令操作码
操作码指令助记符说明示例
0000 AND 逻辑与操作指令ANDS R0,R0,#0x01 ;R0=R0&0x01,取出最低位数据0001 EOR 逻辑异或操作指令EOR R1,R1,#0x0F ;将R1的低4位取反
0010 SUB 减法运算指令SUBS R2,R1,R2 ;R2=R1-R2
0011 RSB 逆向减法指令RSBS R1,R2,R2,LSL#2 ;R1=R2<<2-R2=R2*3
0100 ADD 加法运算指令ADDS R3,R1,R2,LSL#2 ;R3=R1+R2<<2
0101 ADC 带进位加法指令ADDS R0,R0,R2 ADC R1,R1,R3 ;实现64位加法0110 SBC 带进位减法指令SUBS R0,R0,R2 SBC R1,R1,R3 ;实现64位减法0111 RSC 带进位逆向减法指令RSBS R2,R0,#0 RSC R3,R1,#0 ;实现64位数取负1000 TST 位测试指令TST R0,#0x01 ;判断R0的最低位是否为0
1001 TEQ 相等测试指令TEQ R0,R1 ;比较R0与R1是否相等(不影响V位和C位) 1010 CMP 比较指令CMP R1,#10 ;R1与10比较,设置相关标志位
1011 CMN 负数比较指令CMN R0,#1 ;R0+1,判断R0是否为1的补码,若是,则Z置位1100 ORR 逻辑或操作指令ORR R0,R0,#0x0F ;将R0的低4位置1
1101 MOV 数据传送指令MOVS R3,R1,LSL#2 ;R3=R1<<2,并影响标志位
1110 BIC 位清除指令BIC R1,R2,R3 ;将R3的反码和R2相与,结果存到R1 1111 MVN 数据非传送MVN R1,R2 ;将R2按位取反,结果存到R1
5、乘法指令
ARM具有32×32乘法指令、32×32乘加指令、32×32结果为64位的乘、乘加指令。其乘法指令如下表:
助记符说明操作条件码MUL Rd,Rm,Rs 32位乘法指令Rd←Rm*Rs (Rd≠Rm) MUL{cond}{S} MLA Rd,Rm,Rs,Rn 32位乘加指令Rd←Rm*Rs+Rn (Rd≠Rm) MLA{cond}{S} UMULL RdLo,RdHi,Rm,Rs 64位无符号乘法指令(RdLo,RdHi)←Rm*Rs UMULL{cond}{S} UMLAL RdLo,RdHi,Rm,Rs 64位无符号乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi) UMLAL{cond}{S} SMULL RdLo,RdHi,Rm,Rs 64位有符号乘法指令(RdLo,RdHi)←Rm*Rs SMULL{cond}{S} SMLAL RdLo,RdHi,Rm,Rs 64位有符号乘加指令(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi) SMLAL{cond}{S}
ARM乘法指令操作码
操作码指令助记符说明示例
000 MUL 32位乘法指令MULS R0,R3,R7 ;R0=R3×R7,同时设置CPSR中的N、Z位001 MLA 32位乘加指令MLA R1,R2,R3,R0 ;R1=R2×R3+R0
100 UMULL 64位无符号乘法指令UMULL R0,R1,R5,R6 ;(R1、R0)=R5×R6
101 UMLAL 64位无符号乘加指令UMLAL R0,R1,R5,R6 ;(R1、R0)=R5×R6+(R1、R0)
110 SMULL 64位有符号乘法指令SMULL R2,R3,R7,R6 ;(R3、R2)=R7×R6
111 SMLAL 64位有符号乘加指令SMLAL R2,R3,R7,R6 ;(R3、R2)=R7×R6+(R3、R2)
6、ARM分支指令
在ARM中有两种方式可以实现程序跳转,一种是使用分支指令直接跳转,另一种则是直接向PC寄存器去赋值实现跳转。分枝指令表如下:
助记符说明操作条件码位置
B label 分支指令PC←label B{cond}
BL label 带链接的分支指令LR←PC-4,PC←label BL{cond}
BX Rm 带状态切换的分支指令PC←Rm,切换处理器状态BX{cond}
例:B W AITA ;跳转到W AITA标号处 B 0x1234 ;跳转到绝对地址0x1234处BL DELAY ;调用DELAY子程序
ADRL R0,ThumbFun+1 BX R0 ;跳转到R0指定的地址,并根据R0的最低位来切换处理器状态
注:1、B指令跳转到指定的地址执行程序。分支指令B限制在当前指令的±32M字节地址
范围内(ARM指令为字对齐,最低2位地址固定为0)。
2、BL指令先将下一条指令的地址拷贝到R14(即LR)连接寄存器中,然后跳转到指
定地址运行程序。分支指令BL限制在当前指令的±32M字节地址范围内。BL指令用于子
程序调用。
3、BX指令跳转到Rm指定的地址执行程序,若Rm的位[0]为1,则跳转时自动将CPSR
中的标志位T位置,即把目标地址的代码解释为Thumb代码;若Rm的位[0]为0,则跳转
时自动将CPSR中的标志T复位,即把目标地址的代码解释为ARM代码。
7、ARM协处理器指令
ARM 支持协处理器操作,协处理器的控制要通过协处理器命令实现。ARM 协处理器指令表如下:
助记符
说明
操作
条件码位置 CDP coproc,opcode1,CRd,CRn,CRm{,opcode2} 协处理器数据操作指令
取决于协处理器
CDP{cond} LDC{L} coproc,CRd,<地址> 协处理器数据读取指令
LDC{cond}{L} STC{L} coproc,CRd,<地址>
协处理器数据写入指令
STC{cond}{L} MCR coproc,opcode1,Rd,CRn,CRm{,opcode2} ARM 寄存器到协处理器寄存器的数据传送指令 MCR{cond} MRC coproc,opcode1,Rd,CRn,CRm{,opcode2} 协处理器寄存器到ARM 寄存器的数据传送指令
MRC{cond}
助记符中各部分代表的含义: L 可选后缀,指明是长整数传送
coproc 指令操作的协处理器名。标准名为pn ,n 为0~15 CRn
存放第1个操作数的协处理器寄存器 opcode1 协处理器的特定操作码
CRm 存放第2个操作数的协处理器寄存器 CRd 作为目标寄存器的协处理器寄存器 opcode2 可选的协处理器特定操作码
Rd
作为目标寄存的协处理器寄存器
<地址>
指定的内存地址
例: CDP p7,0,c0,c2,c3,0 ;协处理器7操作,操作码为0,可选操作码为0
LDC p5,c2,[R2,#4] ;读取R2+4指向的内存单元的数据,传送到协处理器p5的c2寄存器中
STC p5,c1,[R0] ;将协处理器p5的c1寄存器的数据写入到ARM 处理器的寄存器R0所指向的存储器中 MCR p3,3,R0,c4,c5,6 ;将ARM 处理器寄存器R0中的数据传送到协处理器p3的寄存器c4和c5中 MRC p3,3,R0,c4,c5,6 ;将协处理器p3的寄存器c4和c5中的数据传送到ARM 处理器寄存器R0中
8、ARM 杂项指令
助记符
说明
操作
条件码位置 SWI immed_24 软中断指令 产生软中断,处理器进入管理模式 SWI{cond} MRS Rd,psr
读状态寄存器指令 Rd ←psr ,psr 为CPSR 或SPSR
MRS{cond}
MSR psr_fields,Rm/#immed_8r 写状态寄存器指令
psr_fields ←Rm/#immed_8r ,psr 为CPSR 或SPSR MSR{cond}
助记符中各部分代表的含义:
immed_24 24位立即数,值为0~16777215(1-224)之间的整数
fields 指定传送的区域。(可以是以下的一种或多种)
Rd 目标寄存器。Rd 不允许为R15
c 控制域屏蔽字节(psr[7...0])
注:字
母必须为小写
psr CPSR 或SPSR
x 扩展域屏蔽字节(psr[15...8]) Rm 要传送到状态寄存器指定域的数据的源寄存器 s 状态域屏蔽字节(psr[23...26]) immed_8r 要传送到状态寄存器指定域的8位立即数
f 标志域屏蔽字节(psr[31...24]) 例: MOV R0,#34 SWI 12 ;设置子功能号为34 ;调用12号软中断
MOV R0,#12 MOV R1,#34 SWI 0 ;调用12号软中断 ;设置子功能号为34
MRS R1,CPSR ;将CPSR 状态寄存器读取,保存到R1中 MRS R2,SPSR ;将SPSR 状态寄存器读取,保存到R2中
MSR CPSR_c,#0xD3 ;CPSR[7...0]=0xD3,即切换到管理模式 MSR CPSR_cxsf,R3 ;CPSR=R3
注:只有在特权模式下才能修改状态寄存器。MRS 与MSR 配合使用,实现CPSR 或SPSR 寄存器的读——修改——写操作,可用来进行处理器模式切换、允许/禁止IRQ /FIQ 中断等设置。
9、ARM伪指令
ARM伪指令不是ARM指令集中的指令,只是为了编程方便编译器定义了
伪指令,使用时可以像其它ARM指令一样使用,但在编译时这些指令将被等效
的ARM指令代替。ARM伪指令有四条,如下表所示:
助记符说明操作条件码位置
ADR register,expr 小范围的地址读取伪指令将expr的地址放入register ADR{cond} ADRL register,expr 中等范围的地址读取伪指令将expr的地址放入register ADRL{cond} LDR register,=expr/label-expr 大范围的地址读取伪指令register←expr/label-expr LDR{cond}
NOP 空操作伪指令代替ARM中的空操作,用于延时
助记符中各部分代表的含义:
register 加载的目标寄存器expr(LDR) 32位立即数
expr(ADR、ADRL) 地址表达式label-expr 基于PC的地址表达式或外部表达式
ADR 当地址值是非字对齐时,取值范围-255~255字节之间;是字对齐时,取值范围-1020~1020字节之间,实现查表
ADRL 当地址值是非字对齐时,取值范围-64KB~64KB之间;是字对齐时,取值范围-256KB~256KB之间,实现程序跳转LDR 加载芯片外围功能部件的寄存器地址(32位立即数),以实现各种控制操作
从PC到文字池的偏移量必须是正数并小于1KB;与ARM指令的LDR相比,伪指令的LDR的参数有“=”号
三、Thumb指令集
1、Thumb存储器访问指令
Thumb指令集的LDM和STM指令可以将任何范围为R0~R7的寄存器
子集加载或存储。多寄存器加载和多寄存器存储指令只有LDMIA、STMIA指令,
即每次传送先加载/存储数据,然后地址加4。对堆栈处理只能使用PUSH及POP
指令。Thumb存储器访问指令表如下:
助记符说明操作影响标志LDR Rd,[Rn,#immed_5?4] 加载字数据Rd←[Rn,#immed_5?4],Rd、Rn为R0~R7 无LDRH Rd,[Rn,#immed_5?2] 加载无符号半字数据Rd←[Rn,#immed_5?2],Rd、Rn为R0~R7 无LDRB Rd,[Rn,#immed_5?1] 加载无符号字节数据Rd←[Rn,#immed_5?1],Rd、Rn为R0~R7 无
STR Rd,[Rn,#immed_5?4] 存储字数据[Rn,#immed_5?4]←Rd, Rd、Rn为R0~R7 无STRH Rd,[Rn,#immed_5?2] 存储无符号半字数据[Rn,#immed_5?2]←Rd, Rd、Rn为R0~R7 无STRB Rd,[Rn,#immed_5?1] 存储无符号字节数据[Rn,#immed_5?1]←Rd, Rd、Rn为R0~R7 无
LDR Rd,[Rn,Rm] 加载字数据Rd←[Rn,Rm],Rd、Rn、Rm为R0~R7 无LDRH Rd,[Rn,Rm] 加载无符号半字数据Rd←[Rn,Rm],Rd、Rn、Rm为R0~R7 无LDRB Rd,[Rn,Rm] 加载无符号字节数据Rd←[Rn,Rm],Rd、Rn、Rm为R0~R7 无LDRSH Rd,[Rn,Rm] 加载有符号半字数据Rd←[Rn,Rm],Rd、Rn、Rm为R0~R7无LDRSB Rd,[Rn,Rm] 加载有符号字节数据Rd←[Rn,Rm],Rd、Rn、Rm为R0~R7无
STR Rd,[Rn,Rm] 存储字数据[Rn,Rm]←Rd, Rd、Rn、Rm为R0~R7 无STRH Rd,[Rn,Rm] 存储无符号半字数据[Rn,Rm]←Rd, Rd、Rn、Rm为R0~R7 无STRB Rd,[Rn,Rm] 存储无符号字节数据[Rn,Rm]←Rd, Rd、Rn、Rm为R0~R7 无
LDR Rd,[PC,#immed_8?4] 基于PC加载字数据Rd←[PC,#immed_8?4],Rd为R0~R7 无
LDR Rd,label 基于PC记载字数据Rd←[label],Rd为R0~R7 无
LDR Rd,[SP,#immed_8?4] 基于SP加载字数据Rd←[SP,#immed_8?4],Rd为R0~R7 无
STR Rd,[SP,#immed_8?4] 基于SP存储字数据[SP,#immed_8?4]←Rd, Rd为R0~R7 无LDMIA Rn{!},reglist 多寄存器加载reglist←[Rn...],Rn回写等(R0~R7)无STMIA Rn{!},reglist 多寄存器存储[Rn...]←reglist,Rn回写等(R0~R7)无
PUSH {reglist[,LR]} 寄存器进栈指令[SP...]←reglist[,LR],SP回写等(R0~R7、LR)无
POP {reglist[,PC]} 寄存器出栈指令reglist[,PC]←[SP...],SP回写等(R0~R7、PC)无
2、Thumb数据处理指令
大多数Thumb数据处理指令采用2地址格式,数据处理操作比ARM状
态的更少,访问寄存器R8~R15受到一定限制。Thumb数据处理指令表如下:助记符说明操作影响标志
MOV Rd,#expr 数据传送指令Rd←expr,Rd为R0~R7 影响N、Z
MOV Rd,Rm 数据传送指令Rd←Rm,Rd、Rm均为R0~R15 Rd和Rm均为R0~R7时,影响N、Z,清零C、V MVN Rd,Rm 数据非传送指令Rd←(~Rm),Rd、Rm均为R0~R7 影响N、Z
NEG Rd,Rm 数据取负指令Rd←(~Rm),Rd、Rm均为R0~R7 影响N、Z、C、V
ADD Rd,Rn,Rm 加法运算指令Rd←Rn+Rm,Rd、Rn、Rm均为R0~R7 影响N、Z、C、V
ADD Rd,Rn,#expr3 加法运算指令Rd←Rn+expr3,Rd、Rn均为R0~R7 影响N、Z、C、V
ADD Rd,#expr8 加法运算指令Rd←Rd+expr8,Rd均为R0~R7 影响N、Z、C、V
ADD Rd,Rm 加法运算指令Rd←Rd+Rm,Rd、Rm均可为R0~R15 Rd和Rm均为R0~R7时,影响N、Z、C、V ADD Rd,Rp,#expr SP/PC加法运算指令Rd←SP/PC+expr, Rd为R0~R7 无
ADD SP,#expr SP加法运算指令SP←SP+expr 无
SUB Rd,Rn,Rm 减法运算指令Rd←Rn-Rm,Rd、Rn、Rm均为R0~R7 影响N、Z、C、V
SUB Rd,Rn,#expr3 减法运算指令Rd←Rn-expr3,Rd、Rn均为R0~R7 影响N、Z、C、V
SUB Rd,#expr8 减法运算指令Rd←Rd-expr8,Rd为R0~R7 影响N、Z、C、V
SUB SP,#expr SP减法运算指令SP←SP-expr 无
ADC Rd,Rm 带进位加法指令Rd←Rd+Rm+Carry,Rd、Rm均为R0~R7影响N、Z、C、V
SBC Rd,Rm 带进位减法指令Rd←Rd-Rm-(NOT)Carry,Rd、Rm均为R0~R7影响N、Z、C、V
MUL Rd,Rm 乘法运算指令Rd←Rd*Rm,Rd、Rm均为R0~R7 影响N、Z
AND Rd,Rm 逻辑与操作指令Rd←Rd&Rm,Rd、Rm均为R0~R7 影响N、Z
ORR Rd,Rm 逻辑或操作指令Rd←Rd | Rm,Rd、Rm均为R0~R7 影响N、Z
EOR Rd,Rm 逻辑异或操作指令Rd←Rd*Rm,Rd、Rm均为R0~R7 影响N、Z
BIC Rd,Rm 位清除指令Rd←Rd&(~Rm),Rd、Rm均为R0~R7 影响N、Z
ASR Rd,Rs 算术右移指令Rd←Rd算术右移Rs位,Rd、Rs为R0~R7影响N、Z、C
ASR Rd,Rm,#expr 算术右移指令Rd←Rm算术右移expr位,Rd、Rm为R0~R7影响N、Z、C
LSL Rd,Rs 逻辑左移指令Rd←Rd< LSL Rd,Rm,#expr 逻辑左移指令Rd←Rm< LSR Rd,Rs 逻辑右移指令Rd←Rd>>Rs,Rd、Rs为R0~R7 影响N、Z、C LSR Rd,Rm,#expr 逻辑右移指令Rd←Rm>>expr,Rd、Rm为R0~R7 影响N、Z、C ROR Rd,Rs 循环右移指令Rd←Rd循环右移Rs位,Rd、Rs为R0~R7 影响N、Z、C CMP Rn,Rm 比较指令状态标志←Rn-Rm,Rn、Rm均为R0~R15影响N、Z、C、V CMP Rn,#expr 比较指令状态标志←Rn-expr,Rn为R0~R7影响N、Z、C、V CMN Rn,Rm 负数比较指令状态标志←Rn+Rm,Rn、Rm均为R0~R7影响N、Z、C、V TST Rn,Rm 位测试指令状态标志←Rn&Rm,Rn、Rm均为R0~R7影响N、Z、C、V 3、Thumb分支指令 Thumb分支指令中只有B指令是有条件执行指令。Thumb分支指令表:助记符说明操作条件码位置 B label 分支指令PC←label B{cond} BL label 带链接的分支指令LR←PC-4,PC←label 无 BX Rm 带状态切换的分支指令PC←label,切换处理器状态无 4、Thumb杂项指令 SWI —软中断指令,用于产生软中断,从而实现从用户模式变换到管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量。其它模式下也可使用SWI指令,处理器同样地切换到管理模式。指令格式如下: SWI immed_8 ; immed:8位立即数,值为0~255之间整数。 使用SWI指令时,通常使用以下两种方法进行传递参数: (1)指令中的8 位立即数指定了用户请求的服务类型,参数通过通用寄存器传递。MOV R0,#34 ;设置子功能号为34 SWI 18 ;调用18号软中断 (2)指令中的8位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其它的寄存器传递。MOV R0,#18 ;调用18号软中断MOV R1,#34 ;设置子功能号为34 SWI 0 5、Thumb伪指令 助记符说明操作条件码位置ADR register,expr 小范围的地址读取伪指令将expr的地址放入register ADR{cond} LDR register,=expr/label-expr 大范围的地址读取伪指令register←expr/label-expr LDR{cond} NOP 空操作伪指令代替ARM中的空操作,用于延时 助记符中各部分代表的含义: register 加载的目标寄存器expr(LDR) 32位立即数 expr(ADR) 地址表达式label-expr 基于PC的地址表达式或外部表达式ADR 偏移量必须是正数并小于1KB。expr必须局部定义,不能被导入 LDR 从PC到文字池的偏移量必须是正数并小于1KB 与Thumb指令的LDR相比,伪指令的LDR的参数有“=”号