常用ARM指令集及彙編

一、ARM處理器的尋址方式

二、指令集學習

(一) ARM指令集

1. 指令格式

2. 條件碼

3. ARM存儲器訪問指令

1) LDR/ STR-加載/ 存儲指令

2) LDM/ STM-多寄存器加載/ 存儲指令

3) SWP-寄存器和存儲器交換指令

4. ARM數據處理指令

1) 數據傳送指令

a) MOV-數據傳送指令

b) MVN-數據非傳送指令

2) 算術邏輯運算指令

a) ADD-加法運算指令

b) SUB-減法運算指令

c) RSB-逆向減法指令

d) ADC-帶進位加法指令

e) SBC-帶進位減法指令

f) RSC-帶進位逆向減法指令

g) AND-邏輯“與”

h) ORR-邏輯“或”

i) EOR-邏輯“異或”

j) BIC-位清除指令

3) 比較指令

a) CMP-比較指令

b) CMN-負數比較指令

c) TST-位測試指令

d) TEQ-相等測試指令

4) 乘法指令

a) MUL-32位乘法指令

b) MLA-32位乘加指令

c) UMULL-64位無符號乘法指令

d) UMLAL-64位無符號乘加指令

e) SMULL-64位有符號乘法指令

f) SMLAL-64位有符號乘加指令

5. ARM分支指令

1) B-分支指令

2) BL-帶連接的分支指令

3) BX-帶狀態切換的分支指令

6. ARM協處理器指令

1) CDP-協處理器數據操作指令

2) LDC-協處理器數據讀取指令

3) STC-協處理器數據寫入指令

4) MCR-ARM處理器到協處理器的數據傳送指令

5) MRC-協處理器到ARM處理器的數據傳送指令

7. ARM雜項指令

1) SWI-軟中斷指令

2) MRS-讀狀態寄存器指令

3) MSR-寫狀態寄存器指令

8. ARM僞指令

1) ADR-小範圍的地址讀取僞指令

2) ADRL-中等範圍的地址讀取僞指令

3) LDR-大範圍的地址讀取僞指令

4) NOP-空操作僞指令

(二) Thumb指令集

1. Thumb指令集和ARM指令集的區別

2. Thumb存儲器訪問指令

1) LDR/ STR-加載/ 存儲指令

2) PUSH/ POP-寄存器入棧 / 出棧指令

3) LDMIA/ STMIA-多寄存器加載/ 存儲指令

3. Thumb數據處理指令

1) 數據傳送指令

a) MOV-數據傳送指令

b) MVN-數據非傳送指令

c) NEG-數據取負指令

2) 算術邏輯運算指令

a) ADD-加法運算指令

b) SUB-減法運算指令

c) ADC-帶進位加法指令

d) SBC-帶進位減法指令

e) MUL-乘法運算指令

f) AND-邏輯“與”

g) ORR-邏輯“或”

h) EOR-邏輯“異或”

i) BIC-位清除指令

j) ASR-算術右移指令

k) LSL-邏輯左移指令

l) LSR-邏輯右移指令

m) ROR-循環右移指令

3) 比較指令

a) CMP-比較指令

b) CMN-負數比較指令

c) TST-位測試指令

4. Thumb分支指令

1) B-分支指令

2) BL-帶連接的分支指令

3) BX-帶狀態切換的分支指令

5. Thumb雜項指令

1) SWI-軟中斷指令

6. Thumb僞指令

1) ADR-小範圍的地址讀取僞指令

2) LDR-大範圍的地址讀取僞指令

3) NOP-空操作僞指令

7。彙編指令API

MOV(MOVe)   傳送指令
PUSH     入棧指令
POP     出棧指令
XCHG(eXCHanG)   交換指令
XLAT(TRANSLATE)   換碼指令
LEA (Load Effective Address) 有效地址送寄存器指令
LDS(Load DS with pointer) 指針送寄存器和DS指令
LES(Load ES with pointer) 指針送寄存器和ES指令
LAHF(Load AH with Flags) 標誌位送AH指令
SAHF(Store AH into Flgs) AH送標誌寄存器指令
PUSHF(PUSH the Flags)   標誌進棧指令
POPF(POP the Flags)   標誌出棧指令
ADD     加法指令
ADC     帶進位加法指令
INC     加1指令
SUB(SUBtract)   不帶借位的減法指令
SBB(SuVtrach with borrow) 帶借位的減法指令
DEC(DECrement)   減1指領
NEG(NEGate)   求補指令
CMP(CoMPare)   比較指令
MUL(unsinged MULtiple) 無符號數乘法指令
IMUL(sIgned MUL tiple) 有符號數乘法指令
DIV(unsigned DIVide)   無符號數除法指令
IDIV(sIgned DIVide)   有符號數除法指令
CBW(Count Byte to Word) 字節轉換爲字指令
CWD(Count Word to Doble word) 字轉換爲雙字指令
DAA   壓縮的BCD碼加法十進制調整指令
DAS   壓縮的BCD碼減法十進制調整指令
AAA   非壓縮的BCD碼加法十進制調整指令
AAS   非壓縮的BCD碼加法十進制調整指令
AND     邏輯與指令
OR     邏輯或指令
XOR     邏輯異或指令
NOT     邏輯非指令
TEST     測試指令
SHL(SHift logical Letf)   邏輯左移指令
SHR(SHift logical Right)   邏輯右移指令
ROL(Rotate Left )   循環左移指令P58
ROR(Rotate Right)   循環右移指令P58
RCL(Rotate Left through Carry) 帶進位循環左移
RCR(Rotate Right through Carry) 帶進位循環左移
MOVS(MOVe String)   串傳送指令
STOS(STOre into String) 存入串指令
LODS(LOad from string) 從串取指令
REP(REPeat)   重複操作前
CLD(CLear Direction flag) 清除方向標誌指令
STD(SeT Direction flag)   設置方向標誌指令
CMPS(CoMPare String)   串比較指令
SCAS(SCAn String)   串掃描指令
REPE/REPZ(REPeat while Equal/Zero)相等/爲零時重複操作前綴
REPNE/REPNZ(REPeat while Not Equal/Zero)不相等/不爲零進重複前綴
IN(INput)   輸入指令
OUT(OUTput)   輸出指令
JMP(JuMP)   無條件轉移指令
JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ   條件轉移指令
LOOP     循環指令P70
LOOPZ/LOOPE   爲零/相等時循環指令
LOOPNZ/LOOPNE   不爲零/不相等時循環指令
CALL     子程序調用指令
RET(RETun)   子程序返回指令
CLC(CLear Carry)   進位位置0指令
CMC(CoMplement Carry) 進位位求反指令
SRC(SeT Carry)   進位位置1指令
NOP(No OPeretion)   無操作指令
HLT(HaLT)   停機指令
OFFSET   返回偏移地址
SEG     返回段地址
EQU(=)   等值語句
PURGE   解除語句
DUP     操作數字段用複製操作符
SEGMENT,ENDS   段定義指令
ASSUME   段地址分配指令
ORG     起始偏移地址設置指令
$     地址計數器的當前值
PROC,ENDP   過程定義語句
NAME,TITLE,END   程序開始結束語句
MACRO,ENDM   宏定義指令

JZ   OPR //結果爲零轉移
JNZ   OPR //結果不爲零轉移
JS   OPR //結果爲負轉移
JNS   OPR //結果爲正轉移
JO   OPR //溢出轉移
JNO   OPR //不溢出轉移
JP   OPR //結果爲偶轉移
JNP   OPR //結果爲奇轉移
JC   OPR //有進位轉移
JNC   OPR //無進位轉移
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章