指令格式
ARM微处理器的指令集可以分为分支指令、数据指令指令、程序状态寄存器(CPSR)处理指令、加载/存储指令、协处理指令和异常处理指令六大类。
ARM指令格式
一般指令格式: < opcode > { < code >} { S } < Rd >{ ,< op2 >}
<>:为不可缺省项;
{ }:可以省略;
opcode、codn、S之间没有分隔符;
{S}与Rd之间用空格隔开
指令格式说明
项目 | 含义 | 格式说明 |
---|---|---|
< opcode> | 指令的操作码 | 即助记符,如MOV、ADD、B等 |
{codn} | 条件域,满足条才件执行指令 | 可不加条件即可省略条件,如EQ、NE等 |
S | 指令执行时是否更新CPSR | 可以省略 |
Rd | 目的寄存器 | Rd可以为任意通用寄存器 |
Rn | 第一个源操作数 | Rn可以为任意通用寄存器,Rn可以与Rd相同 |
op2 | 第二个源操作数 | 可为#imm8m、寄存器Rm及任意移位寄存器 |
指令的条件码
助记符后缀 | 标志 | 含义 | 符号 | 条件码 |
---|---|---|---|---|
EQ | Z置位 | 相等 | = | 0000 |
NE | Z清零 | 不相等 | ≠ | 0001 |
MI | N置位 | 负数 | - | 0100 |
PL | N清零 | 正数或零 | + | 0101 |
CS | C置位 | 无符号数大于或等于 | u ≥ | 0010 |
CC | C清零 | 无符号数小于 | u < | 0011 |
LS | C清零Z置位 | 无符号数小于或等于 | u ≤ | 1001 |
HI | C置位Z清零 | 无符号数大于 | u > | 1000 |
GE | N等于V | 带符号数大于或等于 | ≥ | 1010 |
LT | N不等于V | 带符号数小于 | < | 1011 |
LE | Z置位或(N不等于V) | 带符号数小于或等于 | ≤ | 1101 |
GT | Z清零且(N不等于V) | 带符号数大于 | > | 1100 |
VS | V置位 | 溢出 | 0110 | |
VC | V清零 | 未溢出 | 0111 | |
AL | 忽略 | 无条件执行 | 1110 |
位移操作
位移操作符opsh | 操作含义 | 示例 | 示例说明 |
---|---|---|---|
LSL | 逻辑左移 | MOV R0, R1, LSL#2 | 将R1中的内容左移2位送R0中,低位用0填充 |
ASL | 算数左移 | MOV R0, R1, ASL#3 | 将R2中的内容左移3位送入R0中,LSL与ASL效果相同可以互换 |
LSR | 逻辑右移 | MOV R0, R1, RSL#2 | 将R1中的内容右移2位送R0中,高位用0填充 |
ASR | 算数右移 | MOV R0, R1, ASR#3 | 将R1中的内容右移3位送入R0中,左端用bit31位的值填充 |
ROR | 循环右移 | MOV R0, R1, ROR#2 | 将R1中的内容循环右移2位送入R0中 |
RRX | 扩展的循环右移 | MOV R0, R1, RRX#2 | 将R1中的内容扩展(C标志)的循环右移两位送到R0中 |
数据处理指令
指令格式 | 操作 | 功能说明 |
---|---|---|
MOV {cond} {S} Rd, < op2> | 数据传送 | Rd ← \gets ←op2, |
MVN{cond}{S} Rd, < op2> | 取反传送 | Rd$\gets$0xFFFFFFFF EOR op2,即将op2取反后传送到R1 |
CMP {cond} Rd, < op2> | 比较 | Rd - op2, 更新CPSR中的条件标志位 |
CMN {cond} Rd, < op2> | 反值比较 | Rd + op2, 更新CPSR中的条件标志位 |
TST {cond} Rd, < op2> | 位测试 | Rd AND op2,与操作, 更新CPSR中的条件标志位 |
TEQ {cond} Rd, < op2> | 相等测试 | Rd EOR op2,异或操作, 更新CPSR中的条件标志位 |
ADD{cond}{S} Rd, Rn < op2> | 加法 | Rd ← \gets ←Rn+op2 |
ADC{cond}{S} Rd, Rn, < op2> | 带进位加法 | RdRd ← \gets ←Rn+op2+C |
SUB{cond}{S} Rd, Rn < op2> | 减法 | Rd ← \gets ←Rn-op2 |
SBC{cond}{S} Rd, Rn, < op2> | 带借位减法 | RdRd ← \gets ←Rn-op2-!C,!C表示对C取反 |
RSB{cond}{S} Rd, Rn, < op2> | 反向减法 | Rd ← \gets ←op2-Rn |
RSC{cond}{S} Rd, Rn, < op2> | 带借位反向减法 | Rd ← \gets ←op2-Rn-!C |
AND{cond}{S} Rd, Rn, < op2> | 逻辑与 | Rd ← \gets ←Rn AND op2,按位相与,有0出0,全1出1 |
ORR{cond}{S} Rd, Rn, < op2> | 逻辑或 | Rd ← \gets ←Rn ORR op2,按位相或,有1出1,全0出0 |
EOR{cond}{S} Rd, Rn, < op2> | 逻辑异或 | Rd ← \gets ←Rn EORop2,按位相异或,相同出0,不同出1 |
BIC{cond}{S} Rd, Rn, < op2> | 位清零 | Rd ← \gets ←Rn AND NOR(op2),指定位清0 |
MUL{cond}{S} Rd, Rm, Rs | 32乘法 | Rb ← \gets ←Rm×Rs [31:0],只取结果的低32位结果送入Rb |
MLA{cond}{S} Rd, Rm, Rs | 32乘加 | Rb ← \gets ←Rm×Rs [31:0] + Rn |
SUMULL{cond}{S} RdL, RdH, Rm, Rs | 64位有符号乘法指令 | RdL ← \gets ←Rm×Rs的低32位;RdH ← \gets ←Rm×Rs的高32位 |
SMLAL{cond}{S} RdL, RdH, Rm, Rs | 64位有符号乘加指令 | RdL ← \gets ←RdL+Rm×Rs的低32位;RdH ← \gets ←RdL+Rm×Rs的高32位 |
UMULL{cond}{S} RdL, RdH, Rm, Rs | 64位无符号乘加指令 | RdL ← \gets ←Rm×Rs的低32位;RdH ← \gets ←Rm×Rs的高32位 |
UMLAL{cond}{S} RdL, RdH, Rm, Rs | 64位无符号乘加指令 | RdL ← \gets ←RdL+Rm×Rs的低32位;RdH ← \gets ←RdL+Rm×Rs的高32位 |
加载/存储指令
指令格式 | 操作 | 功能说明 |
---|---|---|
LDR {cond} Rd, [Rn {, #< offset>}] {!} | 字数据加载 | Rd ← \gets ←[Rn {offset}],若{!}则Rn = Rn+offset |
LDR {cond}B Rd, [Rn {, #< offset>}] {!} | 字节数据加载 | Rd ← \gets ←[Rn {offset}],若{!}则Rn = Rn+offset,Rd的高24位清零 |
LDR {cond}H Rd, [Rn {, #< offset>}] {!} | 半字节数据加载 | Rd ← \gets ←[Rn {offset}],若{!}则Rn = Rn+offset,Rd的高16位清零 |
STR {cond} Rd, [Rn {, #< offset>}] {!} | 字数据存储 | [Rn {offset}] ← \gets ←Rd,若{!}则Rn = Rn+offset |
STR {cond}B Rd, [Rn {, #< offset>}] {!} | 字节数据存储 | [Rn {offset}] ← \gets ←Rd,若{!}则Rn = Rn+offset |
STR {cond}H Rd, [Rn {, #< offset>}] {!} | 半字节数据存储 | [Rn {offset}] ← \gets ←Rd,Rb(存储一个低16位),若{!}则Rn = Rn+offset |
LDM {cond} {IA/IB/DA/DB} Rn{!}, < reglist> {^} | 数据块加载 | 从[Rn]加载寄存器列表 |
STM {cond} {IA/IB/DA/DB} Rn{!}, < reglist> {^} | 存储数据块 | 将寄存器类表存储到[Rn]中 |
汇编器支持的伪指令
类型 | 格式 | 功能描述及举例 |
符号定义伪指令 | GBLA 全局变量名 | 定义一个全局数字变量,并初始化为0 |
GBLL 全局变量名 | 定义一个全局逻辑变量,并初始化为F | |
GBLS 全局变量名 | 定义一个全局字符变量,并初始化为空 | |
LCLA 局部变量名 | 定义一个局部数字变量,并初始化为0 | |
LCLL 局部变量名 | 定义一个局部逻辑变量,并初始化为F | |
LCLS 局部变量名 | 定义一个局部字符变量,并初始化为空 | |
变量名SETA表达式 | 给一个数值变量赋值 | |
变量名SETL表达式 | 给一个逻辑变量赋值 | |
变量名SETS表达式 | 给一个字符变量赋值 | |
数据定义伪指令 | 标号 DCB 表达式 | 分配一片连续的字节存储单元并对数据初始化 |
标号 DCW 表达式 | 分配一片连续的半字存储单元并对数据初始化 | |
标号 DCD 表达式 | 分配一片连续的字存储单元并对数据初始化 | |
标号 DCQ 表达式 | 分配一片连续的双字存储单元并对数据初始化 | |
汇编控制指令 | IF 逻辑表达式 指令序列 1 ELSE 指令序列 2 ENDIF | 有条件的按照符合逻辑表达式条件汇编指定的指令序列 1,不满足条件,则执行指令序列2 |
WHILE 逻辑表达式 指令序列 WEND | 如果满足逻辑表达式条件,由执行指令序列,否则不执行指令序列 | |
其他指令 | AREA 段名1,属性2,… CODE 属性 DATA 属性 READONLY 属性 READWRITE 属性 ALLGN 属性 COMMON | 定义一个段如代码段或数据段 定义一个代码段,默认只读 READONLY 定义一个数据码,可读写 READWRITE 只读 只写 对齐方式,按照2(ALLGN)字节对齐 通用段属性 |
CODE16 CODE32 | 指示以下指令为16位Thunb指令代码 指示以下指令为32位ARM指令代码 | |
ENTRY | 汇编语言程序入口 | |
END | 汇编语言程序结束 | |
名称EQU表达式[,类型] | 等于伪指令 | |
EXPORT 标号 | 全局标号声明伪指令 | |
INPORT | 引入一个标号伪指令 | |
EXTERN | 外部标号引用声明伪指令 | |