知识目录
ARM指令分类及指令格式
ARM处理器支持32位的ARM指令集,也支持16位的Thumb指令集,从ARMv6开始,新的ARM处理器支持16/32位的Thumb-2指令集,二ARMv7-M仅支持Thumb-2
ARM指令分类
ARM微处理器的指令集可以分为分支指令、数据处理指令、程序状态寄存器(CPSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类
ARM指令格式
指令基本格式
<opcode>{<cond>}{S} <Rd>,<Rn>{<op2>}
其中<>为不可省略,{}为可以省略,opcode。cond与S之间没有分隔符,{S}与Rd之间用空格隔开
指令的条件域
指令的条件域:当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件地执行。当指令的执行满足条件时,指令被执行,否则指令被忽略。
每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面与指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示"相等则跳转”,即当CPSR中的Z标志置位时发生跳转。指令的条件码见下图:
移位操作
ARM指令的寻址方式
立即寻址
立即寻址也称为立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只寻取出指令也就取到了操作数,这个操作数被称为立即数
寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数地址,而操作数本身存放在存储器中,用于间接寻址的寄存器必须用[]括起来。[]可以理解为将寄存器中的内容读取为立即数
寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用一种方式,也是一种执行效率较高的寻址方式。
基址加变址寻址
基址加变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用语访问某基地址附近的地址单元
相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为及地址,指令中的地址标号作为偏移量,将两者相加后得到操作数的有效地址
堆栈寻址
堆栈是一种数据结构,按先进后出(FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈 (Descending Stack)。当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式。
ARM指令集
1.数据处理类指令
可以分为数据传送指令算数逻辑运算指令和比较指令等
指令格式 | 操作 | 备注 |
---|---|---|
MOV | 数据传送 | |
MVN | 取反传送 | |
CMP R1,R0 | 比较 | 将寄存器R1的值减R0的值,根据结果设定CPSR的状态标志位 |
CMN | 反值比较 | |
TST | 位测试 | |
TEQ | 相等测试 | |
ADD | 加法 | |
ADC | 带进位加法 | Rd←Rn + op2 + C |
SUB | 减法 | |
SBC | 带借位减法 | Rd ←Rn - op2 - !C |
RSB | 反向减法 | Rd ← op2 - Rn |
RSC | 带借位反向减法 | |
AND | 逻辑与 | |
ORR | 逻辑或 | |
EOR | 逻辑异或 | |
BIC | 位清除 | 指定位清零 |
MUL | 32位乘法 | 只取结果的低32位 |
MLA | 32位乘加 | |
SMULL | 64位有符号数乘法指令 | RdL ←Rm × Rx的低32位 RdH ← Rm×Rx的高32位 |
SMLAL | 64位有符号数乘加指令 | |
UMULL | 64位无符号数乘法指令 | |
UMLAL | 64位无符号数乘加指令 |
2.程序状态寄存器访问指令
MRS - 程序状态寄存器到通用寄存器的数据传送指令
格式:MRS |cond| Rd,< PSR >;PSR可以是CPSR 或者SPSR
用途:MRS指令用于将程序状态寄存器的内容传送到通用寄存器中
3.分支指令
指令名称 | 操作 | 备注 |
---|---|---|
B | 转移指令 | 一旦遇到一个B指令,处理器将立即跳转到给定的目标地址,从那里继续执行 |
BX | 带状态切换的转移指令 | 跳转到指令中所指定的由寄存器Rn与0xFFFF FFFE 相与后的结果指示的目标地址 |
BL | 带返回的转移指令 | 在跳转之前,会在寄存器R14中保存PC的当前值 |
BLX | 带返回且带状态切换的转移指令 |
4.加载/存储指令
单一数据加载存储指令
指令名称 | 操作 | 备注 |
---|---|---|
LDR | 字数据加载指令 | 从存储器中将一个32位的字数据穿送到目的寄存器中 |
LDRB | 字节数据加载指令 | 将一个8位的字节数据传送到目的寄存器当中,同时将寄存器的高24位清零 |
LDRH | 半字数据加载指令 | 16位数据 |
STR | 字数据存储指令 | 将一个32位的字数据传送到存储器中 |
STRB | 字节数据存储指令 | 8位的字节数据 |
STRH | 半字数据存储指令 | 16位的半字数据 |
批量数据加载存储指令
LDM :批量数据加载指令
STM :批量护具存储指令
ARM汇编器所支持的伪指令
伪指令概念
ARM 处理器的汇编语言与C 语言等高级语言不同,它是面向机器的一种第几语言,可以直接对硬件进行操作,执行效率高,但进行复杂程序设计时难度较大
在ARM汇编语言程序中,有一些特殊的指令助记符。这些助记符与指令系统的助记符不用,没有相应的操作吗,通常称为伪指令,他们完成的操作成为伪操作,伪指令一般与编译程序有关,因此ARM汇编语言的伪指令在不同编译环境下有不同的编写形式和规则。
符号定义伪指令
G - global全局
L - 局部
A - 数值
L - logistics luoji
S - string字符