ARM指令集——數據處理指令

ARM彙編指令集測試

 

ARM彙編文件的組成spa

  1. 指令:編譯完成後做爲一條指令(機器碼)存儲在內存單元中,CPU執行時可以完成處理的操做
  2. 僞指令:在編譯時替換成能被識別的ARM指令
  3. 僞操做:知道編譯器進行編譯,編譯完成後不生成指令,也不佔用內存空間。

ARM彙編指令類型code

  1. 數據處理指令
  2. 跳轉指令:實現程序執行過程當中的跳轉
  3. Load/Store指令:CPU與內存數據之間的操做指令
  4. 狀態寄存器存送指令:對狀態寄存器操做(只能使用這些指令對狀態寄存器操做)
  5. 協處理器指令:對協處理器進行操做
  6. 異常產生指令:產生異常(軟中斷),實現模式切換

數據處理指令 mov,add,adds,adc,sub,subs,sbc,rsb,mul,and,orr,eor,bic,cmp,tst,teq,lsl,lsr,asr,rorvblog

數據處理指令語法內存

<操做{<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]獲得。(一個八位的數循環右移偶數次獲得)
;當即數的本質是包含於指令中的數,佔用指令自己的空間

加法指令 ADDit

;加法指令執行時,若沒有進位 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 

帶進位的加法指令 ADCclass

;兩個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 循環右移:低位移出,高位補低位移出位
相關文章
相關標籤/搜索