匯編語言基礎知識(cortex-M3 指令)


一、書寫格式

標號

  操作碼  操作數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>
PC48位立即數) ADD <Rd>, PC, #<immed_8>*4
SP48位立即數) ADD <Rd>, SP, #<immed_8>*4
SP47位立即數) ADD <Rd>, SP, #<immed_7>*4ADD 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>]
PC8位立即數偏移的和的地址處的數據
加載到寄存器中
LDR <Rd>, [PC, #<immed_8>*4]
SP8位立即數偏移的和的地址處的數據
加載到寄存器中
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>]
將寄存器字保存到SP8位立即數偏移的和的
地址中
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>
SP47位立即數) 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>]!
保存寄存器地址左移0123個位置后的
地址處的數據字
LDR.W <Rxf>, [<Rn>, <Rm>{, LSL #<shift>}]
將寄存器地址左移0123個位置后的地
址處的數據字保存到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>
保存寄存器地址左移0123個位置后的
地址處的字節[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>
保存基址寄存器地址左移0123個位置
后的地址處的半字[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>]!
保存寄存器地址左移0123個位置后的
地址處的帶符號字節[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>]!
保存寄存器地址左移0123個位置后的
地址處的帶符號半字[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>
寄存器字保存到寄存器地址移位0123
個位置的地址中
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>
寄存器字節保存到寄存器地址移位012
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>]
寄存器半字保存到寄存器地址移位012
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


 








 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM