![](https://csdnimg.cn/release/download_crawler_static/88971246/bg1.jpg)
ARM
®
和 Thumb
®
-2 指令集
快速参考卡
表关键字
Rm {, <opsh>}
请参阅表寄存器,可选择移动常数个位
<reglist>
以逗号隔开的寄存器列表,括在大括号 { 和 } 内。
<Operand2>
请参阅表
灵活的操作数 2。移位和循环移位只可用于 Operand2。
<reglist-PC>
作为 <reglist>,不能包含 PC。
<fields>
请参阅表
PSR 字段。
<reglist+PC>
作为 <reglist>,包 含 PC。
<PSR>
APSR(应用程序状态寄存器)、CPSR(当前处理器状态寄存器)或 SPSR(保存的处理器状态寄存
器)
<flags>
nzcvq(ALU 标记 PSR[31:27])或 g(SIMD GE 标记 PSR[19:16])
C*,V* 在体系结构 v4 及更早版本中,标记不可预知;在体系结构 v5 及以后版本中,标记保持不变。
§
请参阅表 ARM 体系结构版本。
<Rs|sh>
可为 Rs 或一个立即数移位值。 每种移位类型的允许值与
+/-
+ 或 –。 (+ 可省略。)
表寄存器,可选择移动常数个位 中的相同。
<iflags>
中断标记。 一个或多个 a、i、f(中止、中断、快速中断)。
x、y B 或 T,B 表示半寄存器 [15:0],T 表示半寄存器 [31:16]。
<p_mode>
请参阅表处理器模式
<imm8m>
ARM:32 位常数,由 8 位值向右循环移偶数位生成。
SPm
<p_mode>
所指定的处理模式的 SP
Thumb: 32 位常数,由 8 位值左移任意位生成,
<lsb>
位域的最低有效位。
格式模式为 0xXYXYXYXY、0x00XY00XY 或 0xXY00XY00。
<width>
位域宽度,<width> + <lsb> 必须 <= 32。
<prefix>
请参阅并行指令的前缀
{X}
如果有 X,则 RsX 为 Rs 循环 16 位生成。 否则,RsX 为 Rs。
{IA|IB|DA|DB}
之后增加、之前增加、之后减小、之前减小。
{!}
如果有 !,则在数据传送完毕后更新基址寄存器 (前变址)。
IB 和 DA 不可用于 Thumb 状态下。 如果省略,则缺省为 IA。
{S}
如果有 S,则更新条件标记。
<size>
B、SB、H 或 SH,含义分别为字节、有符号字节、半字和有符号半字。
{T}
如果有 T,则带有用户模式特权。
SB 和 SH 不可用于 STR 指令。
{R}
如果存在
R,则对结果进行舍入,否则将其截断。
运算
§
汇编器 S 更新 操作 说明
加法 加法
ADD{S} Rd, Rn, <Operand2>
NZCV
Rd := Rn + Operand2
N
带进位
ADC{S} Rd, Rn, <Operand2>
NZCV
Rd := Rn + Operand2 + 进位
N
宽
T2
ADD Rd, Rn, #<imm12>
Rd := Rn + imm12,imm12 的范围为 0-4095
T、P
饱和 {加倍}
5E
Q{D}ADD Rd, Rm, Rn Rd := SAT(Rm + Rn)
加倍: Rd := SAT(Rm + SAT(Rn * 2))
Q
地址 PC 相对的寻址
ADR Rd, <label>
Rd := <label>,有 关 <label> 相对于当前指令的范围,请参阅注释 L
N、L
减法 减法
SUB{S} Rd, Rn, <Operand2>
NZCV
Rd := Rn – Operand2
N
带进位
SBC{S} Rd, Rn, <Operand2>
NZCV
Rd := Rn – Operand2 – NOT(进位)
N
宽
T2
SUB Rd, Rn, #<imm12>
Rd := Rn – imm12,imm12 的范围为 0-4095
T、P
反向减法
RSB{S} Rd, Rn, <Operand2>
NZCV
Rd := Operand2 – Rn
N
带进位反向减法
RSC{S} Rd, Rn, <Operand2>
NZCV
Rd := Operand2 – Rn – NOT(进位)
A
饱和 {加倍}
5E
Q{D}SUB Rd, Rm, Rn Rd := SAT(Rm – Rn)
加倍: Rd := SAT(Rm – SAT(Rn * 2))
Q
从异常中返回,无出栈。
SUBS PC, LR, #<imm8>
NZCV
PC = LR – imm8,CPSR = SPSR(当前模式),imm8 的范围为 0-255。
并行
算法
半字方式加法
6
<prefix>ADD16 Rd, Rn, Rm
Rd[31:16] := Rn[31:16] + Rm[31:16],Rd[15:0] := Rn[15:0] + Rm[15:0]
G
半字方式减法
6
<prefix>SUB16 Rd, Rn, Rm
Rd[31:16] := Rn[31:16] – Rm[31:16],Rd[15:0] := Rn[15:0] – Rm[15:0]
G
字节方式加法
6
<prefix>ADD8 Rd, Rn, Rm
Rd[31:24] := Rn[31:24] + Rm[31:24],Rd[23:16] := Rn[23:16] + Rm[23:16],
Rd[15:8] := Rn[15:8] + Rm[15:8],Rd[7:0] := Rn[7:0] + Rm[7:0]
G
字节方式减法
6
<prefix>SUB8 Rd, Rn, Rm
Rd[31:24] := Rn[31:24] – Rm[31:24],Rd[23:16] := Rn[23:16] – Rm[23:16],
Rd[15:8] := Rn[15:8] – Rm[15:8],Rd[7:0] := Rn[7:0] – Rm[7:0]
G
交换半字,半字方式加法,半字方式减法
6
<prefix>ASX Rd, Rn, Rm
Rd[31:16] := Rn[31:16] + Rm[15:0],Rd[15:0] := Rn[15:0] – Rm[31:16]
G
交换半字,半字方减法,半字方式加法
6
<prefix>SAX Rd, Rn, Rm
Rd[31:16] := Rn[31:16] – Rm[15:0],Rd[15:0] := Rn[15:0] + Rm[31:16]
G
差值的绝对值无符号求和
6
USAD8 Rd, Rm, Rs Rd := Abs(Rm[31:24] – Rs[31:24]) + Abs(Rm[23:16] – Rs[23:16])
+ Abs(Rm[15:8] – Rs[15:8]) + Abs(Rm[7:0] – Rs[7:0])
差值的绝对值无符号求和,再累加
6
USADA8 Rd, Rm, Rs, Rn Rd := Rn + Abs(Rm[31:24] – Rs[31:24]) + Abs(Rm[23:16] – Rs[23:16])
+ Abs(Rm[15:8] – Rs[15:8]) + Abs(Rm[7:0] – Rs[7:0])
饱和 有符号饱和字,右移
6
SSAT Rd, #<sat>, Rm{, ASR <sh>}
Rd := SignedSat((Rm ASR sh), sat)。<sat> 的范围为 1-32,<sh> 的范围为 1-31。
Q、R
有符号饱和字,左移
6
SSAT Rd, #<sat>, Rm{, LSL <sh>}
Rd := SignedSat((Rm LSL sh), sat)。<sat> 的范围为 1-32,<sh> 的范围为 0-31。
Q
有符号饱和两个半字
6
SSAT16 Rd, #<sat>, Rm
Rd[31:16] := SignedSat(Rm[31:16], sat),
Rd[15:0] := SignedSat(Rm[15:0], sat)。<sat> 的范围为 1-16。
Q
无符号饱和字,右移
6
USAT Rd, #<sat>, Rm{, ASR <sh>}
Rd := UnsignedSat((Rm ASR sh), sat)。<sat> 的范围为 0-31,<sh> 的范围为 1-31。
Q、R
无符号饱和字,左移
6
USAT Rd, #<sat>, Rm{, LSL <sh>}
Rd := UnsignedSat((Rm LSL sh), sat)。<sat> 的范围为 0-31,<sh> 的范围为 0-31。
Q
无符号饱和两个半字
6
USAT16 Rd, #<sat>, Rm
Rd[31:16] := UnsignedSat(Rm[31:16], sat),
Rd[15:0] := UnsignedSat(Rm[15:0], sat)。<sat> 的范围为 0-15。
Q