ARM微處理器的指令集是加載/存儲型的,也即指令集僅能處理寄存器中的數(shù)據(jù),而且處理結(jié)果都要放回寄存器中,而對系統(tǒng)存儲器的訪問則需要通過專門的加載/存儲指令來完成。ARM微處理器的指令集可以分為跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器(PSR)處理指令、加載/存儲指令、協(xié)處理器指令和異常產(chǎn)生指令六大類。
ARM助記符指令及其功能描述:ADC帶進位加法指令ADD加法指令AND邏輯與指令B跳轉(zhuǎn)指令BIC位清零指令BL帶返回的跳轉(zhuǎn)指令BLX帶返回和狀態(tài)切換的跳轉(zhuǎn)指令BX帶狀態(tài)切換的跳轉(zhuǎn)指令CDP協(xié)處理器數(shù)據(jù)操作指令CMN比較反值指令CMP比較指令EOR異或指令LDC存儲器到協(xié)處理器的數(shù)據(jù)傳輸指令LDM加載多個寄存器指令LDR存儲器到寄存器的數(shù)據(jù)傳輸指令MCR從ARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳輸指令MLA乘加運算指令MOV數(shù)據(jù)傳送指令MRC從協(xié)處理器寄存器到ARM寄存器的數(shù)據(jù)傳輸指令MRS傳送CPSR或SPSR的內(nèi)容到通用寄存器指令MSR傳送通用寄存器到CPSR或SPSR的指令MUL32位乘法指令MLA32位乘加指令MVN數(shù)據(jù)取反傳送指令ORR邏輯或指令RSB逆向減法指令RSC帶借位的逆向減法指令SBC帶借位減法指令STC協(xié)處理器寄存器寫入存儲器指令STM批量內(nèi)存字寫入指令STR寄存器到存儲器的數(shù)據(jù)傳輸指令SUB減法指令SWI軟件中斷指令SWP交換指令TEQ相等測試指令TST位測試指令。
一、指令、偽指令
指令:是機器碼的助記符,經(jīng)過匯編器編譯為機器碼后,可以由CPU執(zhí)行。
偽指令:用來指導匯編器編譯指令,是匯編器的產(chǎn)物,終不會生成機器碼。
二、ARM指令的編寫風格
匯編代碼大寫:在Windows中的IDE開發(fā)環(huán)境中一般都大寫。
匯編代碼小寫:在Linux環(huán)境中,好遵循GNU風格,即指令一般用小寫。
三、ARM匯編代碼文件后綴的大小寫問題
Windows環(huán)境:因為Windows不區(qū)分大小寫,所以匯編文件后綴大寫、小寫編譯過程沒有區(qū)別,即test.S與test.s編譯結(jié)果一致。
Linux環(huán)境:Linux環(huán)境是嚴格區(qū)分大小寫的,test.S與test.s會被當成不同的文件來處理(處理過程也不一致)。后綴小寫的test.s文件,在編譯階段不進行預處理操作,所以不能在這里面寫預處理的語句(不能有宏定義等,不常用);后綴大寫的test.S文件,會進行預處理、匯編等操作,所以我們可以在這里面加入預處理的命令(比較常用)。
四、ARM匯編指令的格式
ARM匯編指令的格式比較固定、簡單,即是:“操作碼目標寄存器,操作數(shù)1,操作數(shù)2,……操作數(shù)n”。
例如將十六進制數(shù)0xaf放到寄存器r0中,我們用匯編代碼可以這樣寫“mov r0,#0xaf”。這里的“mov”就是操作碼(指令),實現(xiàn)的功能是將“0xaf”這個數(shù)存放到寄存器中“r0”中,“r0”也即是目標寄存器,“#0xaf”也即是操作數(shù)。在這里,“#0xaf”表示立即數(shù)(立即尋址方式指令中給出的數(shù)稱為立即數(shù)立即數(shù),亦即是直接參與運算不需處理的數(shù)),立即數(shù)需要用“#”來標識。
五、常用GNU偽指令
global _start @ 給_start外部鏈接屬性
.section .text @ 指定當前段為代碼段
.ascii .byte .short .long .word
.quad .float .string @ 定義數(shù)據(jù)
.align 4 @ 以4字節(jié)對齊
.balignl 16 0xabcdefgh @ 16字節(jié)對齊填充
.equ @ 類似于C中宏定義
.end @標識文件結(jié)束
.include @ 頭文件包含
.arm / .code32 @聲明以下為arm指令
.thumb / .code16 @聲明以下為thubm指令
ldr 大范圍的地址加載指令
adr 小范圍的地址加載指令
adrl 中等范圍的地址加載指令
nop 空操作
六、常用指令后綴
同一指令經(jīng)常附帶不同后綴,變成不同的指令。經(jīng)常使用的后綴有:
1、B(byte)功能不變,操作長度變?yōu)?位
2、H(half word)功能不變,長度變?yōu)?6位
3、S(signed)功能不變,操作數(shù)變?yōu)橛蟹?
4、條件執(zhí)行后綴
5、“!”與“^”的作用
例如ldr可以加“b”、“h”、“s”變成 ldrb、ldrh、ldrsb、ldrsh用于表示加載8bit數(shù)據(jù)、16bit數(shù)據(jù)、有符號8bit數(shù)據(jù)、有符號16bit數(shù)據(jù)。