| 指令格式: 指令{條件}{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之間。 |
||||||||||||||||||||||||||||||||||||
