一、書寫格式
標號
操作碼 操作數1, 操作數2, ... ; 注釋
標號是可選的,可寫可不寫,但如果有必須頂格寫,其作用是讓匯編器計算程序轉移的地址。
操作碼是指令的助記符,其前面必須有一個空格,通常用TAB。
操作數跟在操作碼后面,通常,第一個操作數都是本條指令執行結果的存儲地。
注釋均已";"開頭
立即數,也就是高級語言的常量,必須以#開頭。
例如:
MOV R0, #0x12 ; R0 <-- 0x12
可以使用EQU來定義常數,且常數的定義必須頂格寫。
例如:
PI EQU 3.14.5926
二、
操作 | 匯編指令 |
寄存器值與寄存器值及 C標志相加 | ADC <Rd>, <Rm> |
3位立即數與寄存器值相加 | ADD <Rd>, <Rn>, #<immed_3> |
8位立即數與寄存器值相加 | ADD <Rd>, #<immed_8> |
低寄存器值與低寄存器值相加 | ADD <Rd>, <Rn>, <Rm> |
高寄存器值與低或高寄存器值相加 | ADD <Rd>, <Rm> |
PC加 4(8位立即數) | ADD <Rd>, PC, #<immed_8>*4 |
SP加 4(8位立即數) | ADD <Rd>, SP, #<immed_8>*4 |
SP加 4(7位立即數) | ADD <Rd>, SP, #<immed_7>*4或 ADD SP, SP, #<immed_7>*4 |
寄存器值按位與 | AND <Rd>, <Rm> |
算術右移,移位次數取決於立即數值 | ASR <Rd>, <Rm>, #<immed_5> |
算術右移,移位次數取決於寄存器中的值 | ASR <Rd>, <Rs> |
條件分支 | B<cond> <target address> |
無條件分支 | B<tartet address> |
位清零 | BIC <Rd>, <Rs> |
軟件斷點 | BKPT <immed_8> |
帶鏈接分支 | BL <Rm> |
比較結果不為零時分支 | CBNZ <Rn>, <label> |
比較結果為零時分支 | CBZ <Rn>, <Rm> |
將寄存器值取反與另一個寄存器值比較 | CMN <Rn>, <Rm> |
與 8位立即數比較 | CMP <Rn>, #<immed_8> |
寄存器比較 | CMP <Rn>, <Rm> |
高寄存器與高或低寄存器比較 | CMP <Rn>, <Rm> |
改變處理器狀態 | CPS <effect>, <iflags> |
將高或低寄存器的值復制到另一個高或低寄 存器中 |
CPY <Rd>, <Rm> |
寄存器的值按位異或 | EOR <Rd>, <Rm> |
IT<cond> IT<x> <cond> IT<x><y> <cond> IT<x><y><z> <cond> |
以下一條指令為條件,以下面兩條指令為條 件,以下面三條指令為條件,以下面四條指令 為條件 |
多個連續的存儲器字加載 | LDMIA <Rn>!, <register> |
將基址寄存器與 5位立即數偏移的和的地址 處的數據加載到寄存器中 |
LDR <Rd>, [<Rn>, #<immed_5*4>] |
將基址寄存器與寄存器偏移的和的地址處的 數據加載到寄存器中 |
LDR <Rd>, [<Rn>, <Rm>] |
將 PC與 8位立即數偏移的和的地址處的數據 加載到寄存器中 |
LDR <Rd>, [PC, #<immed_8>*4] |
將 SP與 8位立即數偏移的和的地址處的數據 加載到寄存器中 |
LDR <Rd>, [SP, #<immed_8>*4] |
將寄存器與 5位立即數偏移的和的地址處的 字節[7:0]加載到寄存器中 |
LDRB <Rd>, [<Rn>, #<immed_5>] |
將寄存器與寄存器偏移的和的地址處的字節 [7:0]加載到寄存器中 |
LDRB <Rd>, [<Rn>, <Rm>] |
將寄存器與 5位立即數偏移的和的地址處的 半字[15:0]加載到寄存器中 |
LDRH <Rd>, [<Rn>, #<immed_5>*2] |
將寄存器與寄存器偏移的和的地址處的半字 [15:0]加載到寄存器中 |
LDRH <Rd>, [<Rn>, <Rm>] |
將寄存器與寄存器偏移的和的地址處的帶符 號字節 [7:0]加載到寄存器中 |
LDRSB <Rd>, [<Rn>, <Rm>] |
將寄存器與寄存器偏移的和的地址處的帶符 號半字 [15:0]加載到寄存器中 |
LDRSH <Rd>, [<Rn>, <Rm>] |
邏輯左移,移位次數取決於立即數值 | LSL <Rd>, <Rm>, #<immed_5> |
邏輯左移,移位次數取決於寄存器中的值 | LSL <Rd>, <Rs> |
邏輯右移,移位次數取決於立即數值 | LSR <Rd>, <Rm>, #<immed_5> |
邏輯右移,移位次數取決於寄存器中的值 | LSR <Rd>, <Rs> |
將 8位立即數傳送到目標寄存器 | MOV <Rd>, #<immed_8> |
將低寄存器值傳送給低目標寄存器 | MOV <Rd>, <Rn> |
將高或低寄存器值傳送給高或低目標寄存器 | MOV <Rd>, <Rm> |
寄存器值相乘 | MUL <Rd>, <Rm> |
將寄存器值取反后傳送給目標寄存器 | MVN <Rd>, <Rm> |
將寄存器值取負並保存在目標寄存器中 | NEG <Rd>, <Rm> |
無操作 | NOP <C> |
將寄存器值按位作邏輯或操作 | ORR <Rd>, <Rm> |
寄存器出棧 | POP <寄存器> |
寄存器和 PC出棧 | POP <寄存器, PC> |
寄存器壓棧 | PUSH <registers> |
寄存器和 LR壓棧 | PUSH <registers, LR> |
將字內的字節逆向(reverse)並復制到寄存器 中 |
REV <Rd>, <Rn> |
將兩個半字內的字節逆向並復制到寄存器中 | REV16 <Rd>, <Rn> |
將低半字[15:0]內的字節逆向並將符號位擴 展,復制到寄存器中。 |
REVSH <Rd>, <Rn> |
循環右移,移位次數由寄存器中的值標識 | ROR <Rd>, <Rs> |
寄存器中的值減去寄存器值和C標志 | SBC <Rd>, <Rm> |
發送事件 | SEV <c> |
將多個寄存器字保存到連續的存儲單元中 | STMIA <Rn>!, <registers> |
將寄存器字保存到寄存器與5位立即數偏移的 和的地址中 |
STR <Rd>, [<Rn>, #<immed_5>*4] |
將寄存器字保存到寄存器地址中 | STR <Rd>, [<Rn>, <Rm>] |
將寄存器字保存到SP與8位立即數偏移的和的 地址中 |
STR <Rd>, [SP, #<immed_8> * 4] |
將寄存器字節[7:0]保存到寄存器與 5位立即 數偏移的和的地址中 |
STRB <Rd>, [<Rn>, #<immed_5>] |
將寄存器字節[7:0]保存到寄存器地址中 | STRB <Rd>, [<Rn>, <Rm>] |
將寄存器半字[15:0]保存到寄存器與 5位立即 數偏移的和的地址中 |
STRH <Rd>, [<Rn>, #<immed_5> * 2] |
將寄存器半字[15:0]保存到寄存器地址中 | STRH <Rd>, [<Rn>, #<immed_5> * 2] |
寄存器值減去3位立即數 | STRH <Rd>, [<Rn>, #<immed_5> * 2] |
寄存器值減去8位立即數 | SUB <Rd>, #<immed_8> |
寄存器值減去寄存器值 | SUB <Rd>, <Rn>, <Rm> |
SP減4(7位立即數) | SUB SP, #<immed_7> * 4 |
操作系統服務調用,帶8位立即數調用代碼 | SVC <immed_8> |
從寄存器中提取字節[7:0],傳送到寄存器中, 並用符號位擴展到32位 |
SXTB <Rd>, <Rm> |
從寄存器中提取半字[15:0],傳送到寄存器中, 並用符號位擴展到32位 |
SXTH <Rd>, <Rm> |
將寄存器與另一個寄存器相與,測試寄存器中 的置位的位 |
TST <Rn>, <Rm> |
從寄存器中提取字節[7:0],傳送到寄存器中, 並用零位擴展到 32位 |
UXTB <Rd>, <Rm> |
從寄存器中提取半字[15:0],傳送到寄存器中, 並用零位擴展到32位 |
UXTH <Rd>, <Rm> |
等待事件 | WFE <c> |
等待中斷 | WFI <c> |
32位指令
操作 | 匯編指令 |
ADC{S}.W <Rd>, <Rn>, #<modify_constant(immed_12> |
寄存器值與12位立即數及C位相加 |
寄存器值與移位后的寄存器值及C位相加 | ADC{S}.W <Rd>, <Rn>, <Rm>{, <shift>} |
ADD{S}.W <Rd>, <Rn>,#<modify_constant(immed_12)> |
寄存器值與12位立即數相加 |
寄存器值與移位后的寄存器值相加 | ADD{S}.W <Rd>, <Rm>{, <shift>} |
寄存器值與12位立即數相加 | ADDW.W <Rd>, <Rn>, #<immed_12> |
AND{S}.W <Rd>, <Rn>, #<modify_constant(immed_12> |
寄存器值與12位立即數按位與 |
寄存器值與移位后的寄存器值按位與 | AND{S}.W <Rd>, <Rn>, Rm>{, <shift>} |
算術右移,移位次數取決於寄存器值 | ASR{S}.W <Rd>, <Rn>, <Rm> |
條件分支 | B{cond}.W <label> |
位區清零 | BFC.W <Rd>, #<lsb>, #<width> |
將一個寄存器的位區插入另一個寄存器中 | BFI.W <Rd>, <Rn>, #<lsb>, #<width> |
12位立即數取反與寄存器值按位與 | BIC{S}.W <Rd>, <Rn>, #<modify_constant(immed_12)> |
移位后的寄存器值取反與寄存器值按位與 | BIC{S}.W <Rd>, <Rn>, {, <shift>} |
帶鏈接的分支 | BL <label> |
帶鏈接的分支(立即數) | BL<c> <label> |
無條件分支 | B.W <label> |
返回寄存器值中零的數目 | CLZ.W <Rd>, <Rn> |
寄存器值與12位立即數兩次取反后的值比較 | CMN.W <Rn>, #<modify_constant(immed_12)> |
寄存器值與移位后的寄存器值兩次取反后的 值比較 |
CMN.W <Rn>, <Rm>{, <shift>} |
寄存器值與12位立即數比較 | CMP.W <Rn>, #<modify_constant(immed_12)> |
寄存器值與移位后的寄存器值比較 | CMP.W <Rn>, <Rm>{, <shift>} |
數據存儲器排序(barrier) | DMB <c> |
數據同步排序(barrier) | DSB <c> |
寄存器值與12位立即數作異或操作 | EOR{S}.W <Rd>, <Rn>, #<modify_constant(immed_12)> |
寄存器值與移位后的寄存器值作異或操作 | EOR{S}.W <Rd>, <Rn>, <Rm>{, <shift>} |
指令同步排序(barrier) | ISB <c> |
多存儲器寄存器加載,加載后加 1或加載前 減 1 |
LDM{IA|DB}.W <Rn>{!}, <registers> |
保存寄存器地址與12位立即數偏移的和的地 址處的數據字 |
LDR.W <Rxf>, [<Rn>, #<offset_12>] |
將寄存器地址與12位立即數偏移的和的地址 處的數據字保存到PC中 |
LDR.W PC, [<Rn>, #<offset_12>] |
將基址寄存器地址的8位立即數偏移的地址 處的數據字保存到PC中,后索引 |
LDR.W PC, #<+/-<offset_8> |
保存基址寄存器地址的8位立即數偏移的地 址處的數據字,后索引 |
LDR.W <Rxf>, [<Rn>], #+/–<offset_8> |
保存基址寄存器地址的8位立即數偏移的地 址處的數據字,前索引 |
LDR.W <Rxf>, [<Rn>, #<+/–<offset_8>]! |
將基址寄存器地址的8位立即數偏移的地址 處的數據字保存到PC中,前索引 |
LDR.W PC, [<Rn>, #+/–<offset_8>]! |
保存寄存器地址左移0, 1, 2或3個位置后的 地址處的數據字 |
LDR.W <Rxf>, [<Rn>, <Rm>{, LSL #<shift>}] |
將寄存器地址左移0, 1, 2或3個位置后的地 址處的數據字保存到PC中 |
LDR.W PC, [<Rn>, <Rm>{, LSL #<shift>}] |
保存PC地址的12位立即數偏移的地址處的數 據字 |
LDR.W <Rxf>, [PC, #+/–<offset_12>] |
將PC地址的12位立即數偏移的地址處的數據 字保存到PC中 |
LDR.W PC, [PC, #+/–<offset_12>] |
保存基址寄存器地址與12位立即數偏移的和 的地址處的字節[7:0] |
LDRB.W <Rxf>, [<Rn>, #<offset_12>] |
保存基址寄存器地址的8位立即數偏移的地 址處的字節[7:0],后索引 |
LDRB.W <Rxf>. [<Rn>], #+/-<offset_8> |
保存寄存器地址左移0, 1, 2或3個位置后的 地址處的字節[7:0] |
LDRB.W <Rxf>, [<Rn>, <Rm>{, LSL #<shift>}] |
保存基址寄存器地址的8位立即數偏移的地 址處的字節[7:0],前索引 |
LDRB.W <Rxf>, [<Rn>, #<+/–<offset_8>]! |
保存PC地址的12位立即數偏移的地址處的字 節 |
LDRB.W <Rxf>, [PC, #+/–<offset_12>] |
保存寄存器地址8位偏移4的地址處的雙字, 前索引 |
LDRD.W <Rxf>, <Rxf2>, [<Rn>, #+/–<offset_8> * 4]{!} |
保存寄存器地址8位偏移4的地址處的雙字, 后索引 |
LDRD.W <Rxf>, <Rxf2>, [<Rn>], #+/–<offset_8> * 4 |
保存基址寄存器地址與12位立即數偏移的和 的地址處的半字[15:0] |
LDRH.W <Rxf>, [<Rn>, #<offset_12>] |
保存基址寄存器地址的8位立即數偏移的地 址處的半字[15:0],前索引 |
LDRH.W <Rxf>, [<Rn>, #<+/–<offset_8>]! |
保存基址寄存器地址的8位立即數偏移的地 址處的半字[15:0],后索引 |
LDRH.W <Rxf>. [<Rn>], #+/-<offset_8> |
保存基址寄存器地址左移0, 1, 2或3個位置 后的地址處的半字[15:0] |
LDRH.W <Rxf>, [<Rn>, <Rm>{, LSL #<shift>}] |
保存PC地址的12位立即數偏移的地址處的半 字 |
LDRH.W <Rxf>, [PC, #+/–<offset_12>] |
保存基址寄存器地址與12位立即數偏移的和 的地址處的帶符號字節[7:0] |
LDRSB.W <Rxf>, [<Rn>, #<offset_12>] |
保存基址寄存器地址的8位立即數偏移的地 址處的帶符號字節[7:0],后索引 |
LDRSB.W <Rxf>. [<Rn>], #+/-<offset_8> |
保存基址寄存器地址的8位立即數偏移的地 址處的帶符號字節[7:0],前索引 |
LDRSB.W <Rxf>, [<Rn>, #<+/–<offset_8>]! |
保存寄存器地址左移0, 1, 2或3個位置后的 地址處的帶符號字節[7:0] |
LDRSB.W <Rxf>, [<Rn>, <Rm>{, LSL #<shift>}] |
保存PC地址的12位立即數偏移的地址處的帶 符號字節 |
LDRSB.W <Rxf>, [PC, #+/–<offset_12>] |
保存基址寄存器地址與12位立即數偏移的和 的地址處的帶符號半字[15:0] |
LDRSH.W <Rxf>, [<Rn>, #<offset_12>] |
保存基址寄存器地址的8位立即數偏移的地 址處的帶符號半字[15:0],后索引 |
LDRSH.W <Rxf>. [<Rn>], #+/-<offset_8> |
保存基址寄存器地址的8位立即數偏移的地 址處的帶符號半字[15:0],前索引 |
LDRSH.W <Rxf>, [<Rn>, #<+/–<offset_8>]! |
保存寄存器地址左移0, 1, 2或3個位置后的 地址處的帶符號半字[15:0] |
LDRSH.W <Rxf>, [<Rn>, <Rm>{, LSL #<shift>}] |
保存PC地址的12位立即數偏移的地址處的帶 符號半字 |
LDRSH.W <Rxf>, [PC, #+/–<offset_12>] |
邏輯左移,移位次數由寄存器中的值標識 | LSL{S}.W <Rd>, <Rn>, <Rm> |
邏輯右移,移位次數由寄存器中的值標識 | LSR{S}.W <Rd>, <Rn>, <Rm> |
將兩個帶符號或無符號的寄存器值相乘,並 將低32位與寄存器值相加 |
MLA.W <Rd>, <Rn>, <Rm>, <Racc> |
將兩個帶符號或無符號的寄存器值相乘,並 將低32位與寄存器值相減 |
MLS.W <Rd>, <Rn>, <Rm>, <Racc> |
將12位立即數傳送到寄存器中 | MOV{S}.W <Rd>, #<modify_constant(immed_12)> |
將移位后的寄存器值傳送到寄存器中 | MOV{S}.W <Rd>, <Rm>{, <shift>} |
將16位立即數傳送到寄存器的高半字[31:16] 中 |
MOVT.W <Rd>, #<immed_16> |
將16位立即數傳送到寄存器的低半字[15:0] 中,並將高半字[31:16]清零 |
MOVW.W <Rd>, #<immed_16> |
將狀態傳送到寄存器中 | MRS<c> <Rd>, <psr> |
傳送到狀態寄存器中 | MSR<c> <psr>_<fields>,<Rn> |
將兩個帶符號或不帶符號的寄存器值相乘 | MUL.W <Rd>, <Rn>, <Rm> |
無操作 | NOP.W |
將寄存器值與12位立即數作邏輯“或非”操作 | ORN{S}.W <Rd>, <Rn>, #<modify_constant(immed_12)> |
將寄存器值與移位后的寄存器值作邏輯“或 非”操作 |
ORN[S}.W <Rd>, <Rn>, <Rm>{, <shift>} |
將寄存器值與12位立即數作邏輯“或”操作 | ORR{S}.W <Rd>, <Rn>, #<modify_constant(immed_12) |
將寄存器值與移位后的寄存器值作邏輯“或 ” 操作 |
ORR{S}.W <Rd>, <Rn>, <Rm>{, <shift>} |
將位順序逆向 | RBIT.W <Rd>, <Rm> |
將字內的字節逆向 | REV.W <Rd>, <Rm> |
將每個半字內的字節逆向 | REV16.W <Rd>, <Rn> |
將低半字內的字節逆向並用符號擴展 | REVSH.W <Rd>, <Rn> |
循環右移,移位次數取決於寄存器中的值 | ROR{S}.W <Rd>, <Rn>, <Rm> |
寄存器值與12位立即數相減 | RSB{S}.W <Rd>, <Rn>, #<modify_constant(immed_12)> |
寄存器值與移位后的寄存器值相減 | RSB{S}.W <Rd>, <Rn>, <Rm>{, <shift>} |
寄存器值與12位立即數及C位相減 | SBC{S}.W <Rd>, <Rn>, #<modify_constant(immed_12)> |
寄存器值與移位后的寄存器值及C位相減 | SBC{S}.W <Rd>, <Rn>, <Rm>{, <shift>} |
將所選的位復制到寄存器中並用符號擴展 | SBFX.W <Rd>, <Rn>, #<lsb>, #<width> |
帶符號除法 | SDIV<c> <Rd>,<Rn>,<Rm> |
發送事件 | SEV<c> |
將帶符號半字相乘並用符號擴展到2個寄存 器值 |
SMLAL.W <RdLo>, <RdHi>, <Rn>, <Rm> |
兩個帶符號寄存器值相乘 | SMULL.W <RdLo>, <RdHi>, <Rn>, <Rm> |
帶符號飽和操作 | SSAT <c> <Rd>, #<imm>, <Rn>{, <shift>} |
多個寄存器字保存到連續的存儲單元中 | STM{IA|DB}.W <Rn>{!}, <registers> |
寄存器字保存到寄存器地址與12位立即數偏 移的和的地址中 |
STR.W <Rxf>, [<Rn>, #<offset_12>] |
寄存器字保存到寄存器地址的8位立即數偏 移的地址中,后索引 |
STR.W <Rxf>, [<Rn>], #+/–<offset_8> |
寄存器字保存到寄存器地址移位0, 1, 2或3 個位置的地址中 |
STR.W <Rxf>, [<Rn>, <Rm>{, LSL #<shift>}] |
寄存器字保存到寄存器地址的8位立即數偏 移的地址中,前索引 |
STR{T}.W <Rxf>, [<Rn>, #+/–<offset_8>]{!} |
寄存器字節[7:0]保存到寄存器地址的 8位立 即數偏移的地址中,前索引 |
STRB{T}.W <Rxf>, [<Rn>, #+/–<offset_8>]{!} |
寄存器字節[7:0]保存到寄存器地址與 12位 立即數偏移的和的地址中 |
STRB.W <Rxf>, [<Rn>, #<offset_12>] |
寄存器字節[7:0]保存到寄存器地址的 8位立 即數偏移的地址中,后索引 |
STRB.W <Rxf>, [<Rn>], #+/–<offset_8> |
寄存器字節保存到寄存器地址移位0, 1, 2或 3個位置的地址中 |
STRB.W <Rxf>, [<Rn>, <Rm>{, LSL #<shift>}] |
存儲雙字,前索引 | STRD.W <Rxf>, <Rxf2>, [<Rn>, #+/–<offset_8> * 4]{!} |
存儲雙字,后索引 | STRD.W <Rxf>, <Rxf2>, [<Rn>], #+/–<offset_8> * 4 |
寄存器半字[15:0]保存到寄存器地址與 12位 立即數偏移的和的地址中 |
STRH.W <Rxf>, [<Rn>, #<offset_12>] |
寄存器半字保存到寄存器地址移位0, 1, 2或 3個位置的地址中 |
STRH.W <Rxf>, [<Rn>, <Rm>{, LSL #<shift>}] |
寄存器半字保存到寄存器地址的8位立即數 偏移的地址中,前索引 |
STRH{T}.W <Rxf>, [<Rn>, #+/–<offset_8>]{!} |
寄存器半字保存到寄存器地址的8位立即數 偏移的地址中,后索引 |
STRH.W <Rxf>, [<Rn>], #+/–<offset_8> |
寄存器值與12位立即數相減 | SUB{S}.W <Rd>, <Rn>, #<modify_constant(immed_12)> |
寄存器值與移位后的寄存器值相減 | SUB{S}.W <Rd>, <Rn>, <Rm>{, <shift>} |
寄存器值與12位立即數相減 | SUBW.W <Rd>, <Rn>, #<immed_12> |
將字節符號擴展到32位 | SXTB.W <Rd>, <Rm>{, <rotation>} |
將半字符號擴展到32位 | SXTH.W <Rd>, <Rm>{, <rotation>} |
表格分支字節 | TBB [<Rn>, <Rm>] |
表格分支半字 | TBH [<Rn>, <Rm>, LSL #1] |
寄存器值與12位立即數作邏輯“異或”操作 | TEQ.W <Rn>, #<modify_constant(immed_12)> |
寄存器值與移位后的寄存器值作邏輯“異或 ” 操作 |
TEQ.W <Rn>, <Rm>{, <shift} |
寄存器值與12位立即數作邏輯“與”操作 | TST.W <Rn>, #<modify_constant(immed_12)> |
寄存器值與移位后的寄存器值作邏輯“與”操 作 |
TST.W <Rn>, <Rm>{, <shift>} |
將寄存器的位區復制到寄存器中,並用零擴 展到32位 |
UBFX.W <Rd>, <Rn>, #<lsb>, #<width> |
無符號除法 | UDIV<c> <Rd>,<Rn>,<Rm> |
兩個無符號寄存器值相乘並與兩個寄存器值 相加 |
UMLAL.W <RdLo>, <RdHi>, <Rn>, <Rm> |
兩個無符號寄存器值相乘 | UMULL.W <RdLo>, <RdHi>, <Rn>, <Rm> |
無符號飽和操作 | USAT <c> <Rd>, #<imm>, <Rn>{, <shift>} |
將無符號字節復制到寄存器中並用零擴展到 32位 |
UXTB.W <Rd>, <Rm>{, <rotation>} |
將無符號半字復制到寄存器中並用零擴展到 32位 |
UXTH.W <Rd>, <Rm>{, <rotation>} |
等待事件 | WFE.W |
等待中斷 | WFI.W |