文档库 最新最全的文档下载
当前位置:文档库 › 第四章 ARM指令系统

第四章 ARM指令系统

第四章 ARM指令系统
第四章 ARM指令系统

一、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 指令的基本格式: {} {S} , {,} 其中,<>号内的项是必需的,{}号内的项是可选的。基本格式中各部分的意义如下表:

第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的参数有“=”号

相关文档