ARM汇编语言指令集汇总

    • 跳转指令
    • 存储器和寄存器交互数据指令(内存访问)
    • 数据传送指令
    • 数据算术运算指令
    • 数据逻辑运算指令
    • 比较指令
    • 组合和分离指令
    • 并行指令
    • 测试指令
    • ThumbEE指令
    • 协处理器指令
    • 伪指令
    • 无线 MMX 技术伪指令
    • 其他指令
    • 寄存器寻址方式

 

跳转指令

指令 简介
B 无条件跳转
BL 带链接的无条件跳转
BX 带状态跳转,更改指令集
BLX 带链接和状态切换的无条件跳转,更改指令集
BXJ 跳转,更改为 Jazelle
TBB , TBH 表跳转字节、半字

存储器和寄存器交互数据指令(内存访问)

➡️ 代表从左到右
⬅️ 代表从右到左

指令 简介
LDR 从存储器中加载数据到寄存器 ⬅️
LDR R8,[R9,#04] R8为待加载数据的寄存器,加载值为 R9+0x4指向的存储单元
STR 将寄存器的数据存储到存储器 ➡️ Store
STR R8,[R9,#04] 将R8寄存器的数据 存到 R9+0x4指向的存储单元 ➡️
LDM 将存储器的数据加载到一个存储器列表 ➡️
LDM R0,{R1-R3} 将R0指向的储存单元的数据依次加载到R1,R2,R3寄存器 ➡️
STM 将一个寄存器列表的数据 存储到指定的存储器 ⬅️
PUSH 将寄存器值推入堆栈
POP 将堆栈值推出到寄存器
SWP 将寄存器与存储器之间的数据进行交换
SWP R1,R1 [R0] 将R1寄存器与R0指向的存储单元的内容进行交换
PLD 预载数据
PLI 预载指令
RFE 从异常中返回
SRS 存储返回状态
LDREX 和 STREX 独占加载和存储寄存器。
CLREX 独占清零,清除执行处理器的局部记录:有地址请求进行独占访问

数据传送指令

指令 简介
MOV 将立即数或寄存器的数据传送到目标寄存器 ⬅️
MOV R1,R0 将寄存器R0的值传送到寄存器R1
MOV PC,R14 将寄存器R14的值传送到PC,常用于子程序返回
MOV R1,R0,LSL#3 将寄存器R0的值左移3位后传送到R1(即乘8)
MOVS PC, R14 将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位
MVN R0,#0 将立即数0取反传送到寄存器R0中,完成后R0=-1(有符号位取反)

数据算术运算指令

指令 简介 ⬅️
ADD 加 ️
SUB 减️
MUL
DIV
ADC 带进位的加法指令
SBC 带借位减法指令
AND 逻辑“与”
ASR 算术右移
RSB 反向减法
SBC 带进位减法
RSC 带进位反向减法(仅 ARM)
SDIV 有符号除法
UDIV 无符号除法
QADD 有符号加法
QSUB 有符号减法
QDADD 加倍加法
QDSUB 加倍减法
SSAT 将有符号值饱和到有符号范围内
USAT 可将有符号值饱和到无符号范围内

数据逻辑运算指令

指令 简介
AND
ORR 或️
EOR 异或️
移位 因为是2进制,逻辑移位左移变大,右移变小,且按2的倍数进行
LSL 逻辑左移 ⬅️
LSR 逻辑右移 ⬅️
ROR 将 Rm 中的值向右循环移
RRX 可提供经右移一位后的寄存器中的值

比较指令

指令 简介
CMP 直接比较
CMP R0 #0 R0寄存器中的值和0比较
CMN 负数比较指令
CMN R1,R0 将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位
CMN R1,#100 将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位
CBZ 比较,为零则跳转
CBNZ 比较,为非零则跳转

组合和分离指令

指令 简介
BFC 和 BFI 位域清零和位域插入
SBFX 和 UBFX 有符号或无符号位域提取
SXT、SXTA、UXT 和 UXTA 符号扩展或零扩展指令,可选择进行加法运算
PKHBT 和 PKHTB 半字组合指令

并行指令

指令 简介
USAD8 差值的绝对值无符号求和
USADA8 差值的绝对值无符号求和再累加
SSAT16 可将有符号值饱和到有符号范围内
USAT16 可将有符号值饱和到无符号范围内
SXT、SXTA UXT 和 UXTA 号扩展,符号扩展加,零扩展和零扩展加

测试指令

指令 简介
TST 位测试指令
TST R1,#%1 用于测试在寄存器R1中是否设置了最低位(%表示二进制数)
TST R1,#0xffe 将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位
TST R0, #0x8 测试bit_3是否为0
TEQ 位测试指令
TEQ R1,R2 将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位

ThumbEE指令

指令 简介
ENTERX, LEAVEX 将状态更改为 ThumbEE 或更改状态 ThumbEE
CHKA (检查数组)可比较两个寄存器中的无符号值
HB、HBL、HBLP 、HBP 处理程序跳转,跳转到指定处理程序
SEL 根据 APSR GE 标记的状态,从每个操作数中选择字节
REV、REV16、REVSH 和 RBIT 在字或半字内反转字节或位的顺序

协处理器指令

指令 简介
CDP 协处理器数据处理操作
CDP2 协处理器数据处理操作
MCR、MCR2、MCRR 和 MCRR2 从寄存器移动到协处理器
LDC、LDC2、STC、STC2 在内存和协处理器之间传送数据,加载协处理器

伪指令

指令 简介
ADRL 将相对于程序或相对于寄存器的地址载入寄存器中(中等范围,与位置无关)
MOV32 将 32 位常数或地址载入寄存器(无范围限制,但与位置相关)
LDR 将 32 位常数或地址载入寄存器(无范围限制,但与位置相关)
UND 生成无体系结构定义的指令。可用于所有 ARM 体系结构

无线 MMX 技术伪指令

指令 简介 例子
TMCR 将源寄存器 Rn 的内容移到控制寄存器 wCn 中 TMCR wc1, r10
TMCRR 将两个源寄存器 RnLo 和 RnHi 的内容移到目标寄存器 wRd TMCRR wr4, r5, r6
TMRC 将控制寄存器 wCn 的内容移到目标寄存器 Rd。不要将 r15 用于 Rd。 TMRC r1, wc2
TMRRC 将源寄存器 wRn 的内容移到两个目标寄存器 RdLo 和 RdHi。 TMRRC r1, r0, wr2
WMOV 将源寄存器 wRn 的内容移到目标寄存器 wRd。 WMOV wr1, wr8
WZERO 清零目标寄存器 wRd。 WZERO wr1

其他指令

指令 简介
CPS 更改处理器状态
CPY 复制
DBG 调试
SWT 协处理器指令,切换用户模式
DCB 伪指令:分配一片连续的字节存储单元并用指定的数据初始化
BIC 位清零指令
BIC R0,R0,#%1011 该指令清除 R0 中的位 0、1、和 3,其余的位保持不变
BKPT 断点,当指令到达某个特定地址处时,使用此指令来检查系统状态
MRS 将 PSR 的内容移到通用寄存器中,MRS{cond} Rd, psr
MSR 将通用寄存器的立即数或内容加载程序状态寄存器 (PSR) 的指定位段中
CPS 更改处理器状态,只允许在特权模式下使用
SMC 安全监控调用 SMC{cond} #immed_16
SETEND 设置 CPSR 中的端序位,不影响 CPSR 中的其他位
NOP 进行填充来使当前位置与指定的边界对齐
SEV 设置事件
WFE|WFI|YIELD 等待事件,等待中断,通知
WFI WFI 会暂时将执行中断挂起,直至发生IRQ后
YIELD YIELD 可告知硬件有线程正在执行任务,例如可换出的自旋锁
DBG 调试提示可向调试系统及其相关系统发送提示
DMB 数据内存屏障可作为内存屏障使用。
DSB 数据同步屏障是一种特殊类型的内存屏障
ISB 指令同步屏障
MAR MAR 指令可将 RdLo 中的值复制到 Acc 的位 [31:0] 中,还会将 RdHi 的最低有效字节复制到 Acc 的位 [39:32] 中。MAR{cond} Acc, RdLo, RdHi
MRA MRA{cond} RdLo, RdHi, Acc 可进行以下操作:将 Acc 的 [31:0] 位复制到 RdLo

寄存器寻址方式

指令 简介
立即寻址 MOV R0,#1234 R0=0x1234
寄存器寻址 MOV R0,R1 R0=R1
寄存器移位寻址 MOV R0,R1,LSL #2 R0=R1*4
寄存器间接寻址 LDR R0,[R1] ;将R1寄存器中的值作为地址,取出值给R0
寄存器间接寻址偏移寻址 LDR R0,[R1,#-4]

更多可参考 《ARM汇编指南》