一、书写格式
标号
操作码 操作数1, 操作数2, ... ; 注释
标号是可选的,可写可不写,但如果有必须顶格写,其作用是让汇编器计算程序转移的地址。
操作码是指令的助记符,其前面必须有一个空格,通常用TAB。
操作数跟在操作码后面,通常,第一个操作数都是本条指令执行结果的存储地。
注释均已";"开头
立即数,也就是高级语言的常量,必须以#开头。
例如:
MOV R0, #0x12 ; R0 <-- 0x12
可以使用EQU来定义常数,且常数的定义必须顶格写。
例如:
PI EQU 3.14.5926
二、
操作 | 汇编指令 |
寄存器值与寄存器值及 C标志相加 | ADC |
3位立即数与寄存器值相加 | ADD |
8位立即数与寄存器值相加 | ADD |
低寄存器值与低寄存器值相加 | ADD |
高寄存器值与低或高寄存器值相加 | ADD |
PC加 4(8位立即数) | ADD |
SP加 4(8位立即数) | ADD |
SP加 4(7位立即数) | ADD # |
寄存器值按位与 | AND |
算术右移,移位次数取决于立即数值 | ASR |
算术右移,移位次数取决于寄存器中的值 | ASR |
条件分支 | B |
无条件分支 | B |
位清零 | BIC |
软件断点 | BKPT |
带链接分支 | BL |
比较结果不为零时分支 | CBNZ |
比较结果为零时分支 | CBZ |
将寄存器值取反与另一个寄存器值比较 | CMN |
与 8位立即数比较 | CMP |
寄存器比较 | CMP |
高寄存器与高或低寄存器比较 | CMP |
改变处理器状态 | CPS |
将高或低寄存器的值复制到另一个高或低寄 存器中 |
CPY |
寄存器的值按位异或 | EOR |
IT IT |
以下一条指令为条件,以下面两条指令为条 件,以下面三条指令为条件,以下面四条指令 为条件 |
多个连续的存储器字加载 | LDMIA |
将基址寄存器与 5位立即数偏移的和的地址 处的数据加载到寄存器中 |
LDR |
将基址寄存器与寄存器偏移的和的地址处的 数据加载到寄存器中 |
LDR |
将 PC与 8位立即数偏移的和的地址处的数据 加载到寄存器中 |
LDR |
将 SP与 8位立即数偏移的和的地址处的数据 加载到寄存器中 |
LDR |
将寄存器与 5位立即数偏移的和的地址处的 字节[7:0]加载到寄存器中 |
LDRB |
将寄存器与寄存器偏移的和的地址处的字节 [7:0]加载到寄存器中 |
LDRB |
将寄存器与 5位立即数偏移的和的地址处的 半字[15:0]加载到寄存器中 |
LDRH |
将寄存器与寄存器偏移的和的地址处的半字 [15:0]加载到寄存器中 |
LDRH |
将寄存器与寄存器偏移的和的地址处的带符 号字节 [7:0]加载到寄存器中 |
LDRSB |
将寄存器与寄存器偏移的和的地址处的带符 号半字 [15:0]加载到寄存器中 |
LDRSH |
逻辑左移,移位次数取决于立即数值 | LSL |
逻辑左移,移位次数取决于寄存器中的值 | LSL |
逻辑右移,移位次数取决于立即数值 | LSR |
逻辑右移,移位次数取决于寄存器中的值 | LSR |
将 8位立即数传送到目标寄存器 | MOV |
将低寄存器值传送给低目标寄存器 | MOV |
将高或低寄存器值传送给高或低目标寄存器 | MOV |
寄存器值相乘 | MUL |
将寄存器值取反后传送给目标寄存器 | MVN |
将寄存器值取负并保存在目标寄存器中 | NEG |
无操作 | NOP |
将寄存器值按位作逻辑或操作 | ORR |
寄存器出栈 | POP <寄存器> |
寄存器和 PC出栈 | POP <寄存器, PC> |
寄存器压栈 | PUSH |
寄存器和 LR压栈 | PUSH |
将字内的字节逆向(reverse)并复制到寄存器 中 |
REV |
将两个半字内的字节逆向并复制到寄存器中 | REV16 |
将低半字[15:0]内的字节逆向并将符号位扩 展,复制到寄存器中。 |
REVSH |
循环右移,移位次数由寄存器中的值标识 | ROR |
寄存器中的值减去寄存器值和C标志 | SBC |
发送事件 | SEV |
将多个寄存器字保存到连续的存储单元中 | STMIA |
将寄存器字保存到寄存器与5位立即数偏移的 和的地址中 |
STR |
将寄存器字保存到寄存器地址中 | STR |
将寄存器字保存到SP与8位立即数偏移的和的 地址中 |
STR |
将寄存器字节[7:0]保存到寄存器与 5位立即 数偏移的和的地址中 |
STRB |
将寄存器字节[7:0]保存到寄存器地址中 | STRB |
将寄存器半字[15:0]保存到寄存器与 5位立即 数偏移的和的地址中 |
STRH |
将寄存器半字[15:0]保存到寄存器地址中 | STRH |
寄存器值减去3位立即数 | STRH |
寄存器值减去8位立即数 | SUB |
寄存器值减去寄存器值 | SUB |
SP减4(7位立即数) | SUB SP, # |
操作系统服务调用,带8位立即数调用代码 | SVC |
从寄存器中提取字节[7:0],传送到寄存器中, 并用符号位扩展到32位 |
SXTB |
从寄存器中提取半字[15:0],传送到寄存器中, 并用符号位扩展到32位 |
SXTH |
将寄存器与另一个寄存器相与,测试寄存器中 的置位的位 |
TST |
从寄存器中提取字节[7:0],传送到寄存器中, 并用零位扩展到 32位 |
UXTB |
从寄存器中提取半字[15:0],传送到寄存器中, 并用零位扩展到32位 |
UXTH |
等待事件 | WFE |
等待中断 | WFI |
32位指令
操作 | 汇编指令 |
ADC{S}.W # |
寄存器值与12位立即数及C位相加 |
寄存器值与移位后的寄存器值及C位相加 | ADC{S}.W |
ADD{S}.W |
寄存器值与12位立即数相加 |
寄存器值与移位后的寄存器值相加 | ADD{S}.W |
寄存器值与12位立即数相加 | ADDW.W |
AND{S}.W # |
寄存器值与12位立即数按位与 |
寄存器值与移位后的寄存器值按位与 | AND{S}.W |
算术右移,移位次数取决于寄存器值 | ASR{S}.W |
条件分支 | B{cond}.W |
位区清零 | BFC.W |
将一个寄存器的位区插入另一个寄存器中 | BFI.W |
12位立即数取反与寄存器值按位与 | BIC{S}.W # |
移位后的寄存器值取反与寄存器值按位与 | BIC{S}.W |
带链接的分支 | BL |
带链接的分支(立即数) | BL |
无条件分支 | B.W |
返回寄存器值中零的数目 | CLZ.W |
寄存器值与12位立即数两次取反后的值比较 | CMN.W |
寄存器值与移位后的寄存器值两次取反后的 值比较 |
CMN.W |
寄存器值与12位立即数比较 | CMP.W |
寄存器值与移位后的寄存器值比较 | CMP.W |
数据存储器排序(barrier) | DMB |
数据同步排序(barrier) | DSB |
寄存器值与12位立即数作异或操作 | EOR{S}.W # |
寄存器值与移位后的寄存器值作异或操作 | EOR{S}.W |
指令同步排序(barrier) | ISB |
多存储器寄存器加载,加载后加 1或加载前 减 1 |
LDM{IA|DB}.W |
保存寄存器地址与12位立即数偏移的和的地 址处的数据字 |
LDR.W |
将寄存器地址与12位立即数偏移的和的地址 处的数据字保存到PC中 |
LDR.W PC, [ |
将基址寄存器地址的8位立即数偏移的地址 处的数据字保存到PC中,后索引 |
LDR.W PC, #<+/- |
保存基址寄存器地址的8位立即数偏移的地 址处的数据字,后索引 |
LDR.W |
保存基址寄存器地址的8位立即数偏移的地 址处的数据字,前索引 |
LDR.W |
将基址寄存器地址的8位立即数偏移的地址 处的数据字保存到PC中,前索引 |
LDR.W PC, [ |
保存寄存器地址左移0, 1, 2或3个位置后的 地址处的数据字 |
LDR.W |
将寄存器地址左移0, 1, 2或3个位置后的地 址处的数据字保存到PC中 |
LDR.W PC, [ |
保存PC地址的12位立即数偏移的地址处的数 据字 |
LDR.W |
将PC地址的12位立即数偏移的地址处的数据 字保存到PC中 |
LDR.W PC, [PC, #+/– |
保存基址寄存器地址与12位立即数偏移的和 的地址处的字节[7:0] |
LDRB.W |
保存基址寄存器地址的8位立即数偏移的地 址处的字节[7:0],后索引 |
LDRB.W |
保存寄存器地址左移0, 1, 2或3个位置后的 地址处的字节[7:0] |
LDRB.W |
保存基址寄存器地址的8位立即数偏移的地 址处的字节[7:0],前索引 |
LDRB.W |
保存PC地址的12位立即数偏移的地址处的字 节 |
LDRB.W |
保存寄存器地址8位偏移4的地址处的双字, 前索引 |
LDRD.W * 4]{!} |
保存寄存器地址8位偏移4的地址处的双字, 后索引 |
LDRD.W #+/– |
保存基址寄存器地址与12位立即数偏移的和 的地址处的半字[15:0] |
LDRH.W |
保存基址寄存器地址的8位立即数偏移的地 址处的半字[15:0],前索引 |
LDRH.W |
保存基址寄存器地址的8位立即数偏移的地 址处的半字[15:0],后索引 |
LDRH.W |
保存基址寄存器地址左移0, 1, 2或3个位置 后的地址处的半字[15:0] |
LDRH.W |
保存PC地址的12位立即数偏移的地址处的半 字 |
LDRH.W |
保存基址寄存器地址与12位立即数偏移的和 的地址处的带符号字节[7:0] |
LDRSB.W |
保存基址寄存器地址的8位立即数偏移的地 址处的带符号字节[7:0],后索引 |
LDRSB.W |
保存基址寄存器地址的8位立即数偏移的地 址处的带符号字节[7:0],前索引 |
LDRSB.W |
保存寄存器地址左移0, 1, 2或3个位置后的 地址处的带符号字节[7:0] |
LDRSB.W |
保存PC地址的12位立即数偏移的地址处的带 符号字节 |
LDRSB.W |
保存基址寄存器地址与12位立即数偏移的和 的地址处的带符号半字[15:0] |
LDRSH.W |
保存基址寄存器地址的8位立即数偏移的地 址处的带符号半字[15:0],后索引 |
LDRSH.W |
保存基址寄存器地址的8位立即数偏移的地 址处的带符号半字[15:0],前索引 |
LDRSH.W |
保存寄存器地址左移0, 1, 2或3个位置后的 地址处的带符号半字[15:0] |
LDRSH.W |
保存PC地址的12位立即数偏移的地址处的带 符号半字 |
LDRSH.W |
逻辑左移,移位次数由寄存器中的值标识 | LSL{S}.W |
逻辑右移,移位次数由寄存器中的值标识 | LSR{S}.W |
将两个带符号或无符号的寄存器值相乘,并 将低32位与寄存器值相加 |
MLA.W |
将两个带符号或无符号的寄存器值相乘,并 将低32位与寄存器值相减 |
MLS.W |
将12位立即数传送到寄存器中 | MOV{S}.W # |
将移位后的寄存器值传送到寄存器中 | MOV{S}.W |
将16位立即数传送到寄存器的高半字[31:16] 中 |
MOVT.W |
将16位立即数传送到寄存器的低半字[15:0] 中,并将高半字[31:16]清零 |
MOVW.W |
将状态传送到寄存器中 | MRS |
传送到状态寄存器中 | MSR |
将两个带符号或不带符号的寄存器值相乘 | MUL.W |
无操作 | NOP.W |
将寄存器值与12位立即数作逻辑“或非”操作 | ORN{S}.W # |
将寄存器值与移位后的寄存器值作逻辑“或 非”操作 |
ORN[S}.W |
将寄存器值与12位立即数作逻辑“或”操作 | ORR{S}.W # |
将寄存器值与移位后的寄存器值作逻辑“或 ” 操作 |
ORR{S}.W |
将位顺序逆向 | RBIT.W |
将字内的字节逆向 | REV.W |
将每个半字内的字节逆向 | REV16.W |
将低半字内的字节逆向并用符号扩展 | REVSH.W |
循环右移,移位次数取决于寄存器中的值 | ROR{S}.W |
寄存器值与12位立即数相减 | RSB{S}.W # |
寄存器值与移位后的寄存器值相减 | RSB{S}.W |
寄存器值与12位立即数及C位相减 | SBC{S}.W # |
寄存器值与移位后的寄存器值及C位相减 | SBC{S}.W |
将所选的位复制到寄存器中并用符号扩展 | SBFX.W |
带符号除法 | SDIV |
发送事件 | SEV |
将带符号半字相乘并用符号扩展到2个寄存 器值 |
SMLAL.W |
两个带符号寄存器值相乘 | SMULL.W |
带符号饱和操作 | SSAT |
多个寄存器字保存到连续的存储单元中 | STM{IA|DB}.W |
寄存器字保存到寄存器地址与12位立即数偏 移的和的地址中 |
STR.W |
寄存器字保存到寄存器地址的8位立即数偏 移的地址中,后索引 |
STR.W |
寄存器字保存到寄存器地址移位0, 1, 2或3 个位置的地址中 |
STR.W |
寄存器字保存到寄存器地址的8位立即数偏 移的地址中,前索引 |
STR{T}.W |
寄存器字节[7:0]保存到寄存器地址的 8位立 即数偏移的地址中,前索引 |
STRB{T}.W |
寄存器字节[7:0]保存到寄存器地址与 12位 立即数偏移的和的地址中 |
STRB.W |
寄存器字节[7:0]保存到寄存器地址的 8位立 即数偏移的地址中,后索引 |
STRB.W |
寄存器字节保存到寄存器地址移位0, 1, 2或 3个位置的地址中 |
STRB.W |
存储双字,前索引 | STRD.W * 4]{!} |
存储双字,后索引 | STRD.W #+/– |
寄存器半字[15:0]保存到寄存器地址与 12位 立即数偏移的和的地址中 |
STRH.W |
寄存器半字保存到寄存器地址移位0, 1, 2或 3个位置的地址中 |
STRH.W |
寄存器半字保存到寄存器地址的8位立即数 偏移的地址中,前索引 |
STRH{T}.W |
寄存器半字保存到寄存器地址的8位立即数 偏移的地址中,后索引 |
STRH.W |
寄存器值与12位立即数相减 | SUB{S}.W # |
寄存器值与移位后的寄存器值相减 | SUB{S}.W |
寄存器值与12位立即数相减 | SUBW.W |
将字节符号扩展到32位 | SXTB.W |
将半字符号扩展到32位 | SXTH.W |
表格分支字节 | TBB [ |
表格分支半字 | TBH [ |
寄存器值与12位立即数作逻辑“异或”操作 | TEQ.W |
寄存器值与移位后的寄存器值作逻辑“异或 ” 操作 |
TEQ.W |
寄存器值与12位立即数作逻辑“与”操作 | TST.W |
寄存器值与移位后的寄存器值作逻辑“与”操 作 |
TST.W |
将寄存器的位区复制到寄存器中,并用零扩 展到32位 |
UBFX.W |
无符号除法 | UDIV |
两个无符号寄存器值相乘并与两个寄存器值 相加 |
UMLAL.W |
两个无符号寄存器值相乘 | UMULL.W |
无符号饱和操作 | USAT |
将无符号字节复制到寄存器中并用零扩展到 32位 |
UXTB.W |
将无符号半字复制到寄存器中并用零扩展到 32位 |
UXTH.W |
等待事件 | WFE.W |
等待中断 | WFI.W |