ARM微处理器的指令系统
整理:Ackarlix
本章介绍ARM指令集、Thumb指令集,以及各类指令对应的寻址方式,通过对本章的阅读,希望读者能了解ARM微处理器所支持的指令集及具体的使用方法。
本章的主要内容有:
- ARM指令集、Thumb指令集概述。
- ARM指令集的分类与具体应用。
- Thumb指令集简介及应用场合。
3.1 ARM微处理器的指令集概述
3.1.1 ARM微处理器的指令的分类与格式
ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。
ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类,具体的指令及功能如表3-1所示(表中指令为基本ARM指令,不包括派生的ARM指令)。
表3-1 ARM指令及功能描述
助记符
|
指令功能描述
|
ADC
|
带进位加法指令
|
ADD
|
加法指令
|
AND
|
逻辑与指令
|
B
|
跳转指令
|
BIC
|
位清零指令
|
BL
|
带返回的跳转指令
|
BLX
|
带返回和状态切换的跳转指令
|
BX
|
带状态切换的跳转指令
|
CDP
|
协处理器数据操作指令
|
CMN
|
比较反值指令
|
CMP
|
比较指令
|
EOR
|
异或指令
|
LDC
|
存储器到协处理器的数据传输指令
|
LDM
|
加载多个寄存器指令
|
LDR
|
存储器到寄存器的数据传输指令
|
MCR
|
从ARM寄存器到协处理器寄存器的数据传输指令
|
MLA
|
乘加运算指令
|
MOV
|
数据传送指令
|
MRC
|
从协处理器寄存器到ARM寄存器的数据传输指令
|
MRS
|
传送CPSR或SPSR的内容到通用寄存器指令
|
MSR
|
传送通用寄存器到CPSR或SPSR的指令
|
MUL
|
32位乘法指令
|
MLA
|
32位乘加指令
|
MVN
|
数据取反传送指令
|
ORR
|
逻辑或指令
|
RSB
|
逆向减法指令
|
RSC
|
带借位的逆向减法指令
|
SBC
|
带借位减法指令
|
STC
|
协处理器寄存器写入存储器指令
|
STM
|
批量内存字写入指令
|
STR
|
寄存器到存储器的数据传输指令
|
SUB
|
减法指令
|
SWI
|
软件中断指令
|
SWP
|
交换指令
|
TEQ
|
相等测试指令
|
TST
|
位测试指令
|
3.1.2 指令的条件域
当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。
每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。
在16种条件标志码中,只有15种可以使用,如表3-2所示,第16种(1111)为系统保留,暂时不能使用。
表3-2 指令的条件码
条件码
|
助记符后缀
|
标志
|
含义
|
|
0000
|
EQ
|
Z置位
|
相等
|
|
0001
|
NE
|
Z清零
|
不相等
|
|
0010
|
CS
|
C置位
|
无符号数大于或等于
|
|
0011
|
CC
|
C清零
|
无符号数小于
|
|
0100
|
MI
|
N置位
|
负数
|
|
0101
|
PL
|
N清零
|
正数或零
|
|
0110
|
VS
|
V置位
|
溢出
|
|
0111
|
VC
|
V清零
|
未溢出
|
|
1000
|
HI
|
C置位Z清零
|
无符号数大于
|
|
1001
|
LS
|
C清零Z置位
|
无符号数小于或等于
|
|
1010
|
GE
|
N等于V
|
带符号数大于或等于
|
|
1011
|
LT
|
N不等于V
|
带符号数小于
|
|
1100
|
GT
|
Z清零且(N等于V)
|
带符号数大于
|
|
1101
|
LE
|
Z置位或(N不等于V)
|
带符号数小于或等于
|
|
1110
|
AL
|
|