介绍
编码标识
- T1, T2, T3…表示第几个Thumb编码
- A1, A2, A3…表示第几个ARM编码
- E1, E2, E3…表示第几个ThumbEE编码
ADC
立即数
加进位(立即数)将立即数和进位标志值与寄存器值相加,并将结果写入目标寄存器。它可以选择根据结果更新条件标志。
T1(ARMv6T2, ARMv7) ADC{S}<c> <Rd>, <Rn>, #<const>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ADC{S}<c> <Rd>, <Rn>, #<const>
寄存器
T1(ARMv6T2, ARMv7) ADC<c> <Rdn>, <Rm>
or ADCS <Rdn>, <Rm>
T2(ARMv6T2, ARMv7) ADC{S}<c>.W <Rd>, <Rn>, <Rm>{, <shift>}
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ADC{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
寄存器移位
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ADC{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>
ADD
加法指令
立即数
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ADDS <Rd>, <Rn>, #<imm3>
or ADD<c> <Rd>, <Rn>, #<imm3>
T2(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ADDS <Rdn>, #<imm8>
or ADD<c> <Rdn>, #<imm8>
T3(ARMv6T2, ARMv7) ADD{S}<c>.W <Rd>, <Rn>, #<const>
T4(ARMv6T2, ARMv7) ADDW<c> <Rd>, <Rn>, #<imm12>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ADD{S}<c> <Rd>, <Rn>, #<const>
寄存器
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ADDS <Rd>, <Rn>, <Rm>
or ADD<c> <Rd>, <Rn>, <Rm>
T2(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ADD<c> <Rdn>, <Rm>
T3(ARMv6T2, ARMv7) ADD{S}<c>.W <Rd>, <Rn>, <Rm>{, <shift>}
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ADD{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
寄存器移位
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ADD{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>
SP加立即数
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ADD<c> <Rd>, SP, #<imm>
T2(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ADD<c> SP, SP, #<imm>
T3(ARMv6T2, ARMv7) ADD{S}<c>.W <Rd>, SP, #<const>
T4(ARMv6T2, ARMv7) ADDW<c> <Rd>, SP, #<imm12>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ADD{S}<c> <Rd>, SP, #<const>
SP加寄存器
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ADD<c> <Rdm>, SP, <Rdm>
T2(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ADD<c> SP, <Rn>
T3(ARMv6T2, ARMv7) ADD{S}<c>.W <Rd>, SP, <Rm>{, <shift>}
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ADD{S}<c> <Rd>, SP, <Rm>{, <shift>}
ADR
将一个直接值加到PC值上,形成一个PC相对地址,并将结果写到目标寄存器。
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ADR<c> <Rd>, <label>
T2(ARMv6T2, ARMv7) ADR<c>.W <Rd>, <label>
label在adr指令前面
T3(ARMv6T2, ARMv7) ADR<c>.W <Rd>, <label>
label在adr指令后面
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ADR<c> <Rd>, <label>
label在adr指令后面
A2(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ADR<c> <Rd>, <label>
label在adr指令前面
AND
立即数
T1(ARMv6T2, ARMv7) AND{S}<c> <Rd>, <Rn>, #<const>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) AND{S}<c> <Rd>, <Rn>, #<const>
寄存器
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ANDS <Rdn>, <Rm>
or AND<c> <Rdn>, <Rm>
T2(ARMv6T2, ARMv7) AND{S}<c>.W <Rd>, <Rn>, <Rm>{, <shift>}
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) AND{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
寄存器移位
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) AND{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>
ASR
算术右移
立即数
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ADDS <Rd>, <Rn>, #<imm3>
or ADD<c> <Rd>, <Rn>, #<imm3>
T2(ARMv6T2, ARMv7) ASR{S}<c>.W <Rd>, <Rm>, #<imm>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ASR{S}<c> <Rd>, <Rm>, #<imm>
寄存器
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) ASRS <Rdn>, <Rm>
or ASR<c> <Rdn>, <Rm>
T2(ARMv6T2, ARMv7) ASR{S}<c>.W <Rd>, <Rn>, <Rm>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) ASR{S}<c> <Rd>, <Rn>, <Rm>
B
跳转
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) B<c> <label>
T2(ARMv4T, ARMv5T*, ARMv6*, ARMv7) B<c> <label>
T3(ARMv6T2, ARMv7) B<c>.W <label>
T4(ARMv6T2, ARMv7) B<c>.W <label>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) B<c> <label
BFC
清除寄存器的位
T1(ARMv6T2, ARMv7) BFC<c> <Rd>, #<lsb>, #<width>
A1(ARMv6T2, ARMv7) BFC<c> <Rd>, #<lsb>, #<width>
BFI
位复制
T1(ARMv6T2, ARMv7) BFI<c> <Rd>, <Rn>, #<lsb>, #<width>
A1(ARMv6T2, ARMv7) BFI<c> <Rd>, <Rn>, #<lsb>, #<width>
BIC
清零对应位
立即数
T1(ARMv6T2, ARMv7) BIC{S}<c> <Rd>, <Rn>, #<const>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) BIC{S}<c> <Rd>, <Rn>, #<const>
寄存器
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) BICS <Rdn>, <Rm>
or BIC<c> <Rdn>, <Rm>
T2(ARMv6T2, ARMv7) BIC{S}<c>.W <Rd>, <Rn>, <Rm>{, <shift>}
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) BIC{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
寄存器移位
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) BIC{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>
BKPT
发生软件断点。
T1(ARMv5T*, ARMv6*, ARMv7) BKPT #<imm8>
A1(ARMv5T*, ARMv6*, ARMv7) BKPT #<imm8>
BL,BLX
跳转到对应地址, 如果X存在,则指定指令集的更改(从ARM到Thumb或从Thumb到ARM)。如果省略X,则处理器保持相同的状态。对于ThumbEE指令,不允许指定X。
立即数
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7 if J1 == J2 == 1) BL<c> <label>
T2(ARMv5T*, ARMv6*, ARMv7 if J1 == J2 == 1) BLX<c> <label>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) BL<c> <label>
A2(ARMv4*, ARMv5T*, ARMv6*, ARMv7) BLX <label>
寄存器
T1(ARMv5T*, ARMv6*, ARMv7) BLX<c> <Rm>
A1(ARMv5T*, ARMv6*, ARMv7) BLX <Rm>
BX
带状态切换的跳转
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) BX<c> <Rm>
A1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) BX<c> <Rm>
BXJ
更改到Jazelle状态。如果尝试失败,它将分支到一个地址和由寄存器指定的指令集,就好像它是一条BX指令一样
T1(ARMv6T2, ARMv7) BXJ<c> <Rm>
A1(ARMv5TEJ, ARMv6*, ARMv7) BXJ<c> <Rm>
CBNZ, CBZ
非零比较分支和零比较分支将寄存器中的值与零进行比较,并有条件地向前分支一个常量值。它们不影响条件标志
T1(ARMv6T2, ARMv7) CB{N}Z <Rn>, <label>
CDP,CDP2
告诉协处理器执行一个独立于ARM核心寄存器和内存的操作。如果没有协处理器可以执行该指令,则生成未定义指令异常
T1(ARMv6T2, ARMv7) CDP<c> <coproc>, <opc1>, <CRd>, <CRn>, <CRm>, <opc2>
T2(ARMv6T2, ARMv7) CDP2<c> <coproc>, <opc1>, <CRd>, <CRn>, <CRm>, <opc2>
A1(RMv4*, ARMv5T*, ARMv6*, ARMv7) CDP<c> <coproc>, <opc1>, <CRd>, <CRn>, <CRm>, <opc2>
A2(RMv4*, ARMv5T*, ARMv6*, ARMv7) CDP2<c> <coproc>, <opc1>, <CRd>, <CRn>, <CRm>, <opc2>
CHKA
比较两个寄存器中的无符号值。如果第一个小于或等于 其次,它将PC复制到LR,并导致对IndexCheck处理程序的分支
E1 CHKA<c> <Rn>, <Rm>
CLREX
清除执行处理器的本地记录,该记录显示某个地址有独占访问请求
T1(ARMv7) CLREX<c>
A1(ARMv6K, ARMv7) CLREX
CLZ
第一个二进制1位之前的二进制零位的个数。
T1(ARMv6T2, ARMv7) CLZ<c> <Rd>, <Rm>
A1(ARMv5T*, ARMv6*, ARMv7) CLZ<c> <Rd>, <Rm>
CMN
将立即数或寄存器的值加到对应寄存器, 并根据结果更新程序状态寄存器
立即数
T1(ARMv6T2, ARMv7) CMN<c> <Rn>, #<const>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) CMN<c> <Rn>, #<const>
寄存器
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) CMN<c> <Rn>, <Cm>
T2(ARMv6T2, ARMv7) CMN<c>.W <Rn>, <Rm>{, <shift>}
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) CMN<c> <Rn>, <Rm>{, <shift>}
寄存器移位
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) CMN<c> <Rn>, <Rm>, <type> <Rs>
CMP
将寄存器减去立即数或寄存器的值, 并根据结果更新程序状态寄存器
立即数
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) CMP<c> <Rn>, #<imm8>
T2(ARMv6T2, ARMv7) CMP<c>.W <Rn>, #<const>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) CMP<c> <Rn>, #<const>
寄存器
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) CMP<c> <Rn>, <Cm>
T2(ARMv4T, ARMv5T*, ARMv6*, ARMv7) CMP<c> <Rn>, <Cm>
T3(ARMv6T2, ARMv7) CMP<c>.W <Rn>, <Rm> {, <shift>}
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) CMP<c> <Rn>, <Rm>{, <shift>}
寄存器移位
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) CMP<c> <Rn>, <Rm>, <type> <Rs>
CPS
更改一个或多个CPSR。{A, I, F}中断掩码位和CPSR。M模式字段,不改变其他CPSR位
T1(ARMv6*, ARMv7) CPS<effect> <iflags>
T2(ARMv6T2, ARMv7) CPS<effect>.W <iflags>{, #<mode>}
or CPS #<mode>
A1(ARMv6*, ARMv7) CPS<effect> <iflags>{, #<mode>}
or CPS #<mode>
CPY
与mov一样
CSDB
内存屏障,控制投机执行和数据值预测。
T1(ARMv6T2, ARMv7) CSDB{<c>}.W
A1(ARMv6*, ARMv7) CSDB{<c>}
DBG
提供调试和相关系统的提示
T1(ARMv7) DBG<c> #<option>
A1(ARMv7) DBG<c> #<option>
DMB
数据内存屏障是一种内存屏障,它确保了对内存访问的观察顺序。
T1(ARMv7) DMB<c> <option>
A1(ARMv7) DMB <option>
DSB
数据同步屏障是一种内存屏障,可确保完成内存访问,
T1(ARMv7) DSB<c> <option>
A1(ARMv7) DSB <option>
ENTERX, LEAVEX
ENTERX从Thumb模式到ThumbEE模式, LEAVEX从ThumbEE模式到Thumb模式
ENTERX在Hyp模式没定义
T1(ARMv7) ENTERX
or LEAVEX
EOR
或操作
立即数
T1(ARMv6T2, ARMv7) EOR{S}<c> <Rd>, <Rn>, #<const>
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) EOR{S}<c> <Rd>, <Rn>, #<const>
寄存器
T1(ARMv4T, ARMv5T*, ARMv6*, ARMv7) EORS <Rdn>, <Rm>
or EOR<c> <Rdn>, <Rm>
T2(ARMv6T2, ARMv7) EOR{S}<c>.W <Rd>, <Rn>, <Rm>{, <shift>}
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) EOR{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
寄存器移位
A1(ARMv4*, ARMv5T*, ARMv6*, ARMv7) EOR{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>
ERET
当在Hyp模式下执行时,Exception Return从ELR_hyp加载PC,从SPSR_hyp加载CPSR。
T1(ARMv6T2, ARMv7, ARMv7VE) SUBS PC, LR, #0
(ARMv6T2, ARMv7) or ERET<c>
(ARMv7VE)
A1(ARMv7VE) ERET<c>
HB, HBL
分支到指定的处理程序。
E1 HB{L}<c> #<HandlerID>
HBLP
E1 HBLP<c> #<imm>, #<HandlerID>
HBP
E1 HBP<c> #<imm>, #<HandlerID>
HVC
在执行HVC指令时,HSR使用EC值将异常报告为Hypervisor Call异常 0x12,并捕获立即参数的值
T1(ARMv7VE) HVC #<imm>
A1(ARMv7VE) HVC #<imm>
ISB
同步屏障刷新处理器中的管道
T1(ARMv7) ISB<c> <option>
A1(ARMv7) ISB <option>
IT
f-Then使以下至多四条指令(IT块)成为有条件的。IT块中指令的条件与IT指令为块中的第一条指令指定的条件相同,或者相反
T1 IT{<x>{<y>{<z>}}} <firstcond>
:表示第一条指令的条件码,例如 EQ(相等)、NE(不相等)等。
IT 指令 | 执行掩码 | 描述 | 条件1 | 条件2 | 条件3 | 条件4 |
---|
IT | T | 仅第一条指令条件执行 | T | | | |
ITT | TT | 前两条指令条件执行 | T | T | | |
ITTE | TTE | 前两条指令条件执行,第三条反向执行 | T | T | E | |
ITET | TET | 第一条指令条件执行,第二条反向执行,第三条条件执行 | T | E | T | |
ITTEE | TTEE | 前两条指令条件执行,后两条反向执行 | T | T | E | E |
ITETT | TETT | 第一条指令条件执行,第二条反向执行,后两条条件执行 | T | E | T | T |
ITETE | TETE | 第一条指令条件执行,第二条反向执行,第三条条件执行,第四条反向执行 | T | E | T | E |
ITEE | TEE | 第一条指令条件执行,后两条反向执行 | T | E | E | |
IT | E | 仅第一条指令反向执行 | E | | | |
ITE | TE | 第一条指令条件执行,第二条反向执行 | T | E | | |
ITEE | TEE | 第一条指令条件执行,后两条反向执行 | T | E | E | |
ITTT | TTT | 前三条指令条件执行 | T | T | T | |
ITTTE | TTTE | 前三条指令条件执行,第四条反向执行 | T | T | T | E |
ITETTE | TETTE | 第一条指令条件执行,第二条反向执行,后三条条件执行 | T | E | T | T |
ITEEE | TEEE | 第一条指令条件执行,后三条反向执行 | T | E | E | E |
ITTTEE | TTTEE | 前三条指令条件执行,最后一条反向执行 | T | T | T | E |
ITTTT | TTTT | 前四条指令条件执行 | T | T | T | T |
- T 表示 “Then”:指令在条件满足时执行。
- E 表示 “Else”:指令在条件不满足时执行。
LDC,LDC2
加载协处理器将存储器数据从连续存储器地址序列加载到协处理器。
立即数
T1(ARMv6T2, ARMv7) LDC{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}
or LDC{L}<c> <coproc>, <CRd>, [<Rn>], #+/-<imm>
or LDC{L}<c> <coproc>, <CRd>, [<Rn>], <option>
T2(ARMv6T2, ARMv7) LDC2{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}
or LDC2{L}<c> <coproc>, <CRd>, [<Rn>], #+/-<imm>
or LDC2{L}<c> <coproc>, <CRd>, [<Rn>], <option>
A1(RMv4*, ARMv5T*, ARMv6*, ARMv7) LDC{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}
or LDC{L}<c> <coproc>, <CRd>, [<Rn>], #+/-<imm>
or LDC{L}<c> <coproc>, <CRd>, [<Rn>], <option>
A2(RMv4*, ARMv5T*, ARMv6*, ARMv7) LDC2{L}<c> <coproc>, <CRd>, [<Rn>, #+/-<imm>]{!}
or LDC2{L}<c> <coproc>, <CRd>, [<Rn>], #+/-<imm>
or LDC2{L}<c> <coproc>, <CRd>, [<Rn>], <option>
字面量
T1(ARMv6T2, ARMv7) LDC{L}<c> <coproc>, <CRd>, <label>
or LDC{L}<c> <coproc>, <CRd>, [PC, #-0]
or LDC{L}<c> <coproc>, <CRd>, [PC], <option>
T2(ARMv6T2, ARMv7) LDC2{L}<c> <coproc>, <CRd>, <label>
or LDC2{L}<c> <coproc>, <CRd>, [PC, #-0]
or LD2C{L}<c> <coproc>, <CRd>, [PC], <option>
A1(RMv4*, ARMv5T*, ARMv6*, ARMv7) LDC{L}<c> <coproc>, <CRd>, <label>
or LDC{L}<c> <coproc>, <CRd>, [PC, #-0]
or LDC{L}<c> <coproc>, <CRd>, [PC], <option>
A2(RMv4*, ARMv5T*, ARMv6*, ARMv7) LDC2{L}<c> <coproc>, <CRd>, <label>
or LDC2{L}<c> <coproc>, <CRd>, [PC, #-0]
or LDC2{L}<c> <coproc>, <CRd>, [PC], <option>