ARM彙編指令集
ARM彙編檔案的組成
- 指令:編譯完成後作為一條指令(機器碼)存儲在記憶體單元中,CPU執行時能夠完成處理的操作
- 僞指令:在編譯時替換成能被識别的ARM指令
- 僞操作:知道編譯器進行編譯,編譯完成後不生成指令,也不占用記憶體空間。
ARM彙編指令類型
- 資料處理指令
- 跳轉指令:實作程式執行過程中的跳轉
- Load/Store指令:CPU與記憶體資料之間的操作指令
- 狀态寄存器存送指令:對狀态寄存器操作(隻能使用這些指令對狀态寄存器操作)
- 協處理器指令:對協處理器進行操作
- 異常産生指令:産生異常(軟中斷),實作模式切換
資料處理指令 mov,add,adds,adc,sub,subs,sbc,rsb,mul,and,orr,eor,bic,cmp,tst,teq,lsl,lsr,asr,rorv
資料處理指令文法
<操作{<cond>}{S}> <Rd>, <Rn>, <Operand2>
<操作碼> <目标寄存器Rd> <第一操作寄存器Rn> <第二操作數Operand2>
;第一個位置必須是寄存器,第二操作數可以是寄存器,也可以是立即數
資料傳送指令 MOV
mov r1, #0x1 ;r1 = 0x1 0x1 是立即數
mov r2, r1 ;r2 = r1
mvn r3, r2 ;r3 = ~r2
mov r1, 0xffffff00 ;0xffffff00 不是立即數,隻是編譯器在編譯階段對其進行了替換
mvn r1, 0x000000ff ;替換的指令
;一條資料傳送指令 mov reg, #n mov reg占用 bit[31:12],bit[11:0]留給立即數使用,是以立即數自包含2^12個
;一個立即數由 bits[8:0]循環右移 2 * bits[11:9]得到。(一個八位的數循環右移偶數次得到)
;立即數的本質是包含于指令中的數,占用指令本身的空間
加法指令 ADD
;加法指令執行時,若沒有進位 CPSR 'C' 位置 0
mov r0, #1
mov r1, #1
add r2, r1, r0 ;r2 = r1 + r0
add r2, r1, #2 ;r2 = r1 + 2
資料操作對CPSR的影響
;預設情況下,資料處理指令不影響條件碼标志位,但可以選擇通過添加“S”來影響标志位。
mov r1, #0mov r2, #-1
adds r3, r1, r2
帶進位的加法指令 ADC
;兩個64位數相加,第一個64位的低32位放在 r0,高位放到 r1,第二個64位數的低32位放在 r2 高32位放在 r3
;編寫代碼實作兩個64位數的和,結果的低32位放在 r4 高32位放在 r5
mov r0, #0xfffffffe ;第一個數的低32位
mov r1, #1 ;第一個數的高32位
mov r2, #0x5 ;第二個數的低32位
mov r3, #1 ;第二個數的高32位
adds r4, r0, r2
adc r5, r1, r3 ; adc運算的實質是 r5 = r1 + r3 + 'C' 'C'位 CPSR 進位标志
減法指令 SUB
;減法指令執行時,沒有借位時 CPSR 'C' 位置 1
mov r0, #5
mov r1, #3
sub r2, r0, r1 ;r2 = r0 - r1
帶借位的減法指令 SBC
mov r0, #1 ;第一個數的低32位
mov r1, #3 ;第一個數的高32位
mov r2, #3 ;第二個數的低32位
mov r3, #1 ;第二個輸的高32位
subs r4, r0, r2
sbc r5, r1, r3
逆向減法指令 RSB
mov r0, #3
rsb r1, r0, #5 ;r1 = 5 - r0
乘法指令 MUL
;為了提高效率,任何乘法指令不可以使用立即數
mov r0, #3
mov r1, #5
mov r2, r0, r1 ;r2 = r0 * r1
乘——累加指令 MLA
mla r3 ,r0, r1, r2 ;r3 = (r0 * r1) + r2
邏輯與指令 AND
mov r0, #0xf0
mov r1, #0x0f
and r2, r0, r1 ;r2 = r0 & r1
邏輯或指令 ORR
mov r0, #0xf0
mov r1, #0x0f
orr r2, r0, r1 ;r2 = r0 | r1
邏輯異或運算指令 EOR
mov r0, #0xf0
mov r1, #0x0f
eor r2, r0, r1 ;r2 = r0 ^ r1
位清零指令 BIC
mov r0, #0xff
bic r0, r0, #0xf ;第二個操作數的每一位為 1 就把第一個操作數對應的位清零
比較指令 CMP
;實質是一條減法指令
;沒有目标register,用來比較兩個數是否相等,結果放到 CPSR 的 'Z' 位判斷
mov r0, #2
mov r1, #1
cmp r0, r1
位測試指令 TST
;實質是與運算 常用于用來測試某一位或某幾位是 0 還是 1,結果通過 CPSR 的 'Z' 位判斷
tst r0, #0x3
相等測試指令 TEQ
;實質是異或運算,測試兩個數是否相等,兩個數相等時異或結果位 0,通過 CPSR 的 'Z' 位判斷
teq r0, r1
移位指令 LSL、LSR、ASR、ROR
;需要與mov配合,不能夠單獨使用
mov r0, #0xff
mov r1, r0, lsl #4 ;将 r0 邏輯左移 4 位放入 r1 中
;LSL 邏輯左移:高位移出,低位補零
;LSR 邏輯右移:低位移出,高位補零
;ASR 算是右移:低位移出,高位補符号位
;ROR 循環右移:低位移出,高位補低位移出位