指令格式: 指令{條件}{S} {目的Register},{OP1},{OP2} |
"{ }"中的內容可選。即,可以不帶條件只有目的寄存器,或 只有目的寄存器和操作數1,也可以同時包含所有選項。“S” 決定指令的操作是否影響CPSR中條件標志位的值,當沒有S時指令不更新CPSR中條件標志位的值 |
||||||||||||||||||||||||||||||||
|
助記符 |
英文全稱 |
示例、功能 |
||||||||||||||||||||||||||||||
跳 轉 指 令 |
B |
Branch |
B Label ;程序無條件跳轉到標號Label處執行 |
||||||||||||||||||||||||||||||
BL |
Branch with Link |
BL Label ;當程序無條件跳轉到標號Label處執行時,同時將當前的PC值保存到R14中 |
|||||||||||||||||||||||||||||||
BLX |
Branch with Link and exchange |
BLX Label;從ARM指令集跳轉到指令中所指定的目標地址,並將處理器的工作狀態由ARM狀態切換到Thumb狀態,該指令同時將PC的當前內容保存到寄存器R14中 |
|||||||||||||||||||||||||||||||
BX |
Branch and exchange |
BX Label;跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM指令,也可以是Thumb指令 |
|||||||||||||||||||||||||||||||
數 據 處 理
|
MOV |
Move |
MOV R1,R0,LSL#3 ;將寄存器R0的值左移3位后傳送到R1 |
||||||||||||||||||||||||||||||
MVN |
Move NOT |
MVN R0,#0 ;將立即數0取反傳送到寄存器R0中,完成后R0=-1 |
|||||||||||||||||||||||||||||||
CMP |
Compare |
CMP R1,R0 ;將寄存器R1的值與寄存器R0的值相減,並根據結果設置CPSR的標志位 |
|||||||||||||||||||||||||||||||
CMN |
Compare negative |
CMN R1,R0 ;將寄存器R1的值與寄存器R0的值相加,並根據結果設置CPSR的標志位 |
|||||||||||||||||||||||||||||||
TST |
Test |
TST R1,#0xffe ;將寄存器R1的值與立即數0xffe按位與,並根據結果設置CPSR的標志位 |
|||||||||||||||||||||||||||||||
TEQ |
Test equivalence |
TEQ R1,R2 ;將寄存器R1的值與寄存器R2的值按位異或,並根據結果設置CPSR的標志位 |
|||||||||||||||||||||||||||||||
ADD |
Add |
ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1) |
|||||||||||||||||||||||||||||||
ADC |
Add with carry |
ADCS R2,R6,R10; R2 = R6+R10+!C,且更新CPSR的進位標志位 |
|||||||||||||||||||||||||||||||
SUB |
Subtract |
SUB R0,R1,#256 ; R0 = R1 – 256 |
|||||||||||||||||||||||||||||||
SBC |
Subtract with carry |
SUBS R0,R1,R2; R0 = R1 - R2 - !C,並根據結果設置CPSR的進位標志位 |
|||||||||||||||||||||||||||||||
RSB |
Reverse subtract |
RSB R0,R1,R2;R0 = R2 – R1 |
|||||||||||||||||||||||||||||||
RSC |
Reverse subtract with carry |
RSC R0,R1,R2 ; R0 = R2 – R1 - !C |
|||||||||||||||||||||||||||||||
AND |
And |
AND R0,R0,#3;該指令保持R0的0、1位,其余位清零。 |
|||||||||||||||||||||||||||||||
ORR |
OR |
ORR R0,R0,#3;該指令設置R0的0、1位,其余位保持不變。 |
|||||||||||||||||||||||||||||||
EOR |
Exclusive OR |
EOR R0,R0,#3 ;該指令反轉R0的0、1位,其余位保持不變。 |
|||||||||||||||||||||||||||||||
BIC |
Bit clear |
BIC R0,R0,#0b1011;該指令清除 R0 中的位 0、1、和 3,其余的位保持不變。 |
|||||||||||||||||||||||||||||||
CLZ |
Count left zero |
計算操作數最高端0的個數 |
|||||||||||||||||||||||||||||||
乘 加 指 令 |
MUL |
Multiply |
MUL R0,R1,R2 ;R0 = R1 × R2 |
||||||||||||||||||||||||||||||
MLA |
Multiply and accumulate |
MLAS R0,R1,R2,R3;R0 = R1 × R2 + R3,同時設置CPSR中的相關條件標志位 |
|||||||||||||||||||||||||||||||
SMULL |
Signed multiply long |
SMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 R1 = (R2 × R3)的高32位 |
|||||||||||||||||||||||||||||||
SMLAL |
Signed mul l and accumulate l |
SMLAL R0,R1,R2,R3 ;R0 =(R2 × R3)的低32位+R0; R1 =(R2 × R3)的高32位+ R1 |
|||||||||||||||||||||||||||||||
UMULL |
Unsigned multiply long |
UMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位;R1 =(R2 × R3)的高32位 |
|||||||||||||||||||||||||||||||
UMLAL |
Unsigned mul&accumulate lon |
UMLAL R0,R1,R2,R3 ;R0 =(R2 × R3)的低位+R0;R1 =(R2 × R3)的高32位+R1 |
|||||||||||||||||||||||||||||||
PSR 訪問 |
MRS |
Move PSR to register |
MRS R0,CPSR;傳送CPSR的內容到R0 |
||||||||||||||||||||||||||||||
MSR |
Move register to PSR |
MSR CPSR_c ,R0;傳送R0的內容到SPSR,但僅僅修改CPSR中的控制位域 |
|||||||||||||||||||||||||||||||
加載/ 存儲 指令 |
LDR |
Load word |
LDR R0,[R1,R2]!;將存儲器地址為R1+R2的字數據讀入R0,並將新地址R1+R2寫入R1。 |
||||||||||||||||||||||||||||||
LDRB |
Load byte |
LDRB R0,[R1,#8] ;將存儲器地址為R1+8的字節數據讀入R0,並將R0的高24位清零 |
|||||||||||||||||||||||||||||||
LDRH |
Load half word |
LDRH R0,[R1];將存儲器地址為R1的半字數據讀入寄存器R0,並將R0的高16位清零 |
|||||||||||||||||||||||||||||||
LDM |
Load multiple |
LDMFD R13!,{R0,R4-R12,PC};將堆棧內容恢復到寄存器(R0,R4到R12,LR) |
|||||||||||||||||||||||||||||||
STR |
Store |
STR R0,[R1],#8 ;將R0中的字數據寫入R1為地址的存儲器中,並將新地址R1+8寫入R1 |
|||||||||||||||||||||||||||||||
STRB |
Store byte |
STRB R0,[R1,#8] ;將寄存器R0中的字節數據寫入以R1+8為地址的存儲器中 |
|||||||||||||||||||||||||||||||
STRH |
Store half word |
STRH R0,[R1,#8];將寄存器R0中的半字數據寫入以R1+8為地址的存儲器中 |
|||||||||||||||||||||||||||||||
STM |
Store multiple |
STMFD R13!,{R0,R4-R12,LR} ;將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧 |
|||||||||||||||||||||||||||||||
數據 交換 |
SWP |
Swap word |
SWP R0,R1,[R2];R2所指的字數據傳送到R0,同時R1的數據傳送到R2所指的單元 |
||||||||||||||||||||||||||||||
SWPB |
Swap byte |
SWPB R0,R1,[R2] ;R2所指的字節數據傳送到R0,R0高24位清零,同時R1低8位送R2所指單元。 |
|||||||||||||||||||||||||||||||
移 位 指 令 |
LSL |
Logic shift left |
MOV R0, R1, LSL#2(ASL#2) ;將R1中的內容左移兩位后傳送到R0中,低位用0填充 |
||||||||||||||||||||||||||||||
ASL |
Arithmetic shift left |
||||||||||||||||||||||||||||||||
LSR |
Logic shift right |
MOV R0, R1, LSR#2 ;將R1中的內容右移兩位后傳送到R0中,左端用零來填充 |
|||||||||||||||||||||||||||||||
ASR |
Arithmetic shift right |
MOV R0, R1, ASR#2 ;將R1中的內容右移兩位后傳送到R0中,左端用第31位的值來填充 |
|||||||||||||||||||||||||||||||
ROR |
Rotate right |
MOV R0, R1, ROR#2 ;將R1中的內容循環右移兩位后傳送到R0中 |
|||||||||||||||||||||||||||||||
RRX |
Rotate right extended |
左端用進位標志位C來填充 |
|||||||||||||||||||||||||||||||
協處 理器 |
CDP |
Data operations |
|
||||||||||||||||||||||||||||||
LDC |
Load |
|
|||||||||||||||||||||||||||||||
STC |
Store |
|
|||||||||||||||||||||||||||||||
MCR |
Move to coproc fr ARM reg |
|
|||||||||||||||||||||||||||||||
MRC |
M to ARM reg fr coprocessor |
|
|||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
PSR field |
F (Flags field mask byte) |
S (Stats field mask byte) |
X (Extension field mask byte) |
C (control field mask byte) |
|||||||||||||||||||||||||||||
CPSR |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
意義 |
N |
Z |
C |
V |
Q |
DNZ (RAZ) 系統擴展用 |
I |
F |
T |
M4 |
M3 |
M2 |
M1 |
M0 |
|||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
CPSR 各位 詳細 意義 |
N |
|
當前指令運算結果為負時,N = 1; 結果為非負時,N = 0 |
||||||||||||||||||||||||||||||
Z |
|
運算結果為0,Z=1;否則Z=0 |
|||||||||||||||||||||||||||||||
C |
|
上溢出、進位C=1;下溢出、借位C=0 |
|||||||||||||||||||||||||||||||
V |
|
加減法V=1表示符號位溢出 |
|||||||||||||||||||||||||||||||
I |
|
I=1時,禁止IRQ中斷 |
|||||||||||||||||||||||||||||||
F |
|
F=1時,禁止FIQ中斷 |
|||||||||||||||||||||||||||||||
T |
|
T=0,ARM指令;T=1,Thumb指令 |
|||||||||||||||||||||||||||||||
M[4:0] |
0b10000 |
User |
|||||||||||||||||||||||||||||||
0b10001 |
FIQ |
||||||||||||||||||||||||||||||||
0b10010 |
IRQ |
||||||||||||||||||||||||||||||||
0b10011 |
Supervisor |
||||||||||||||||||||||||||||||||
0b10111 |
Abort |
||||||||||||||||||||||||||||||||
0b11011 |
Undefined |
||||||||||||||||||||||||||||||||
0b11111 |
System |
||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
指令 格式 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|||||||
Cond |
|
|
|
Opcode |
S |
Rn |
Rd |
Shift_operand |
|||||||||||||||||||||||||||||||
opcode |
|
指令操作符編碼 |
|||||||||||||||||||||||||||||||||||||
S |
|
決定指令的操作是否影響CPSR的值 |
|||||||||||||||||||||||||||||||||||||
Rd |
|
目標寄存器編碼 |
|||||||||||||||||||||||||||||||||||||
Rn |
|
包含第一個操作數的寄存器編碼 |
|||||||||||||||||||||||||||||||||||||
Shift_oprand |
|
表示第二個操作數 |
|||||||||||||||||||||||||||||||||||||
Cond |
|
指令執行的條件編碼,詳細如下所示 |
|||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||
條 件 域 |
EQ |
Z=1 |
Equal |
||||||||||||||||||||||||||||||||||||
NE |
Z=0 |
Not equal, or unordered |
|||||||||||||||||||||||||||||||||||||
CS/HS |
C=1 |
Carry set / Unsigned higher or same |
Great than or equal, or unordered |
||||||||||||||||||||||||||||||||||||
CC/LO |
C=0 |
Carry clear / Unsigned lower |
Less than |
||||||||||||||||||||||||||||||||||||
MI |
N=1 |
Negative |
Less than |
||||||||||||||||||||||||||||||||||||
PL |
N=0 |
Positive or zero |
Greater than or equal , or unordered |
||||||||||||||||||||||||||||||||||||
VS |
V=1 |
Overflow |
Unordered |
||||||||||||||||||||||||||||||||||||
VC |
V=0 |
No overflow |
Not unordered |
||||||||||||||||||||||||||||||||||||
HI |
C=1且Z=0 |
Unsigned higher |
Greater than, or unordered |
||||||||||||||||||||||||||||||||||||
LS |
C=0或Z=1 |
Unsigned lower or same |
Less than or equal |
||||||||||||||||||||||||||||||||||||
GE |
N=1且V=1 或N=0且V=0 |
Signed greater than or equal |
Greater than or equal |
||||||||||||||||||||||||||||||||||||
LT |
N=1且V=0 或N=0且V=1 |
Signed less than |
Less than , or unordered |
||||||||||||||||||||||||||||||||||||
GT |
Z=0或N=V |
Signed greater than |
Great than |
||||||||||||||||||||||||||||||||||||
LE |
Z=1或N!=V |
Signed less than or equal |
Less than or equal , or unordered |
||||||||||||||||||||||||||||||||||||
AL |
|
Always (normally omitted) |
|||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||
並行 指令 前綴 |
S |
|
Signed arithmetic modulo 28 or 216 ,sets CPSR GE bit |
||||||||||||||||||||||||||||||||||||
Q |
|
Signed saturating arithmetic |
|||||||||||||||||||||||||||||||||||||
SH |
|
Signed arithmetic, halving results |
|||||||||||||||||||||||||||||||||||||
U |
|
Unsigned arithmetic modulo 28 or 216 ,sets CPSR GE bit |
|||||||||||||||||||||||||||||||||||||
UQ |
|
Unsigned saturating arithmetic |
|||||||||||||||||||||||||||||||||||||
UH |
|
Unsigned arithmetic ,halving results |
|||||||||||||||||||||||||||||||||||||
批量 傳輸 地址 模式 |
Block load / store |
Stack pop / push |
|||||||||||||||||||||||||||||||||||||
IA |
Increment after |
FD |
Full descending |
||||||||||||||||||||||||||||||||||||
IB |
Increment before |
ED |
Empty descending |
||||||||||||||||||||||||||||||||||||
DA |
Decrement after |
FA |
Full ascending |
||||||||||||||||||||||||||||||||||||
DB |
Decrement before |
EA |
Empty ascending |
||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||
ARM 指令 尋址 方式 |
立即尋址 |
ADD R0,R0,#0x3f |
R0←R0+0x3f |
||||||||||||||||||||||||||||||||||||
寄存器尋址 |
ADD R0,R1,R2 |
R0←R1+R2 |
|||||||||||||||||||||||||||||||||||||
間接尋址 |
ADD R0,R1,[R2] |
R0←R1+[R2] |
|||||||||||||||||||||||||||||||||||||
變址尋址 |
LDR R0,[R1,#4] |
R0←[R1+4] |
|||||||||||||||||||||||||||||||||||||
LDR R0,[R1,#4]! |
R0←[R1+4]、R1←R1+4 |
||||||||||||||||||||||||||||||||||||||
LDR R0,[R1] ,#4 |
R0←[R1]、R1←R1+4 |
||||||||||||||||||||||||||||||||||||||
LDR R0,[R1,R2] |
R0←[R1+R2] |
||||||||||||||||||||||||||||||||||||||
多寄存器尋址 |
LDMIA R0,{R1,R2,R3,R4} |
R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+12] |
|||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||
偽指令及偽操作 |
|||||||||||||||||||||||||||||||||||||||
符號 定義
|
|
GBLA / LCLA |
定義一個全局 / 局部的數字變量,並初始化為0 |
||||||||||||||||||||||||||||||||||||
GBLL / LCLL |
定義一個全局 / 局部的邏輯變量,並初始化為F(假) |
||||||||||||||||||||||||||||||||||||||
GBLS / LCLS |
定義一個全局 / 局部的字符串變量,並初始化為空 |
||||||||||||||||||||||||||||||||||||||
SETA / SETL / SETS |
給一個數學 / 邏輯 / 字符串變量賦值 |
||||||||||||||||||||||||||||||||||||||
RLIST |
對一個通用寄存器列表定義名稱,訪問次序為根據寄存器的編號由低到高,與排列次序無關 |
||||||||||||||||||||||||||||||||||||||
數據 定義 |
|
DCB(=)/ DCW(DCWU) |
分配一片連續的字節 / 半字存儲單元並用指定的數據初始化 |
后綴U表示不要求對齊 |
|||||||||||||||||||||||||||||||||||
DCFS(DCFSU)/DCFD(DCFDU) |
分配一片連續的(單 / 雙精度的浮點數)字存儲單元並用指定的數據初始化 |
||||||||||||||||||||||||||||||||||||||
DCQ(DCQU)/DCD(DCDU) |
用於分配一片以雙字 / 字為單位的連續的存儲單元並用指定的數據初始化 |
||||||||||||||||||||||||||||||||||||||
DCDO |
分配字內存但願,初始化為標號基於靜態基址寄存器R9的偏移量 |
||||||||||||||||||||||||||||||||||||||
DCI |
和DCD類似,不同處在於DCI內存中的數據被標識為指令 |
||||||||||||||||||||||||||||||||||||||
SPACE(%) |
DataSpace SPACE 100 ;分配連續100字節的存儲單元並初始化為0 |
||||||||||||||||||||||||||||||||||||||
MAP(^) |
MAP 0x100,R0 ;定義結構化內存表首地址的值為0x100+R0 |
||||||||||||||||||||||||||||||||||||||
FIELD(#) |
A FIELD 16 ;定義A的長度為16字節 |
||||||||||||||||||||||||||||||||||||||
控制 偽 指令 |
IF、ELSE、ENDIF |
IF 邏輯表達式 指令序列1 ELSE 指令序列2 ENDIF |
IF、ELSE、ENDIF偽指令能根據條件的成立與否決定是否執行某個指令序列。 當IF后面的邏輯表達式為真,則執行指令序列1,否則執行指令序列2。其中, ELSE及指令序列2可以沒有,此時,當IF后面的邏輯表達式為真,則執行 指令序列1,否則繼續執行后面的指令。
|
||||||||||||||||||||||||||||||||||||
WHILE、WEND |
WHILE 邏輯表達式 指令序列 WEND |
WHILE、WEND偽指令能根據條件的成立與否決定是否循環執行某個指令序列。當WHILE后面的邏輯表達式為真,則執行指令序列,該指令序列執行完畢后,再判斷邏輯表達式的值,若為真則繼續執行,一直到邏輯表達式的值為假。 |
|||||||||||||||||||||||||||||||||||||
MACRO、MEND MEXIT |
MACRO $標號宏名 $參數1,$參數2,……指令序列 MEND |
$標號在宏指令被展開時,標號會被替換為用戶定義的符號, 宏指令可以使用一個或多個參數,當宏指令被展開時,這些參數被相應的值替換。 MEXIT用於從宏定義中跳轉出去 |
|||||||||||||||||||||||||||||||||||||
|
AREA |
AREA 段名 屬性1,屬性2,…… |
用於定義一個代碼段或數據段。其中,段名若以數字開頭,則該段名需用“|”括起來,如|1_test|。 |
||||||||||||||||||||||||||||||||||||
|
ALIGN |
AREA Init,CODE,ALIEN=3 |
指定后面的指令為8字節對齊 |
||||||||||||||||||||||||||||||||||||
|
CODE |
CODE16、CODE32 |
指定指令序列為16位的Thumb指令或32位的ARM指令 |
||||||||||||||||||||||||||||||||||||
|
ENTRY |
|
在一個完整的匯編程序中至少要有一個ENTRY(也可以有多個,當有多個ENTRY時,程序的真正入口點由鏈接器指定),但在一個源文件里最多只能有一個ENTRY(可以沒有)。 |
||||||||||||||||||||||||||||||||||||
|
EQU(*) |
名稱 EQU 表達式 {,類型} |
為程序中的常量、標號等定義一個等效的字符名稱 |
||||||||||||||||||||||||||||||||||||
|
EXPORT |
EXPORT 標號 |
用於在聲明一個全局的標號,該標號可在其他的文件中引用。EXPORT可用GLOBAL代替。 |
||||||||||||||||||||||||||||||||||||
|
IMPORT |
IMPORT 標號 |
用於通知編譯器要使用的標號在其他的源文件中定義,無論當前源文件是否引用該標號,該標號均會被加入到當前源文件的符號表中 |
||||||||||||||||||||||||||||||||||||
|
EXTERN |
EXTERN 標號 |
用於通知編譯器要使用的標號在其他的源文件中定義,但要在當前源文件中引用,如果當前源文件實際並未引用該標號,該標號就不會被加入到當前源文件的符號表中 |
||||||||||||||||||||||||||||||||||||
|
GET |
GET 文件名 |
將一個源文件包含到當前的源文件中,並將被包含的源文件在當前位置進行匯編處理 |
||||||||||||||||||||||||||||||||||||
|
INCBIN |
INCBIN 文件名 |
INCBIN偽指令用於將一個目標文件或數據文件包含到當前的源文件中,被包含的文件不作任何變動的存放在當前文件中,編譯器從其后開始繼續處理 |
||||||||||||||||||||||||||||||||||||
|
RN |
名稱 RN 表達式 |
RN偽指令用於給一個寄存器定義一個別名 |
||||||||||||||||||||||||||||||||||||
|
ROUT |
{名稱} ROUT |
ROUT偽指令用於給一個局部變量定義作用范圍。在程序中未使用該偽指令時,局部變量的作用范圍為所在的AREA,而使用ROUT后,局部變量的作為范圍為當前ROUT和下一個ROUT之間。 |
||||||||||||||||||||||||||||||||||||