ARM 匯編 數據處理指令


一. 如何把數據放到寄存器中

 1. 數據搬移指令 mov  , mvn

  1)  指令格式:<opcode><cond>{s}   Rd,  operand

            <操作碼><條件碼>{是否影響狀態位}  目標寄存器,第一操作數

  2)  operand 第一操作數范圍:(有效數和立即數前加 ‘#’)立即數 / 有效數 , 一個寄存器 , 移位指令         

  3) 關於立即數兩個條件約束 舉例說明:

    一個數據  X (一個32bit數據) 把這個數據轉化為 二進制 ,(條件1)所有的位 中為 1 的都要在 連續的 8 個bit 位里面;

    (條件2)把這 8 個bit 位數據拿出來,如果這個 8 bit 數據循環右移偶數位,還可以是 X 這個數據,則X 是一個立即數。

  4) 關於有效數,一個數 X 按位取反后得到數 Y ,如果數 Y 是一個立即數, 則 X 是一個有效數

    5)【 mov  r0, #0xff 】 把數據 0xff 放在寄存器 r0 中  ; mov 表示直接把數據移動到目標寄存器中,r1 中值為 0xff

       【 mvn  r1,#0x55 】 把數據 0x55 按位取反后 放在寄存器 r1 中  ; mvn 表示把數據按位取反后放在目標寄存器中, r1 中值為0xaa

 

2. 想在寄存器中放一個非立即數或者有效數

  使用偽指令 ldr  【 ldr r0,=0xfe000001 】 把數據0xfe000001 放在寄存器r0 中

 二. 移位操作

3. 邏輯左移指令 【 lsl 】 低位補0,高位移出

  【 mov r1, #0xff  】    @ 1111 1111 ---> 0001 1111 1110

  【 lsl  r0, r1, #0x1 】  @ 把r1中的數據0xff 左移一位放在寄存器 r0 中 

  r0中值應該為 0x1fe 

 

4. 邏輯右移指令 【 lsr 】 低位移出,高位補0  

    【 mov r0, #0xff 】    @ 1111 1111 ---> 0111 1111

  【 lsr r1, r0, #0x1 】 @把r0 中的數據 0xff 右移一位把結果放在寄存器 r1 中

  r1 中的值為 0x7f

5. 算術右移指令 【 asr 】 低位移出,高位補符號位

  【 mov r1, #0x8000000f 】  @ 最高位表示符號位  1000 ...... 1111 ---> 1100 ...... 0111

  【 asr r0, r1, #0x1 】@ 把 r1中的值算術右移一位

6. 循環右移指令 【 ror 】 低位移出,高位補移出位

  【 mov r0, #0xff 】 @   1111 1111 ---> 1000 ..... 0111 1111

  【 ror r1, r0, #0x1

三. 加減乘法運算

7. 加法指令 【 add ,adc 】 add表示加法指令,adc 表示帶進位的加法指令, 會計算 CPSR 寄存器中的 狀態位

兩個例子:通過 adds 和 adc 同時影響

@ 例子1  32 位數據加法運算 mov r0, #0xf0 mov r1, #0x0f add r2, r1, r0 @ 把寄存器 r1和r0中的值相加放在寄存器r2中,r2的中值為0xff @ 例子2 64 位數據運算 mov r0, #0x1 @數據高位 mov r1, #0xfffffffe @數據低位 mov r2, #0x1 @數據高位 mov r3, #0xf @數據低位 adds r5, r1, r3 @adds 中 s 表示影響 CPSR 中的 狀態為 adc  r4, r0, r2     @ adc 表示帶進位的加法運算, CPSR中的狀態位 效果 r4 = r0 + r1 + c

8. 減法指令 【 sub ,sbc 】   sub 表示減法指令, sbc 表示帶借位的減法指令,會計算CPSR 中的狀態位

兩個例子:

@ 例子 1   32 位數據減法 mov r1, #0x3 mov r2, #0x4 sub r0, r2, r1 @ r0 = r2 - r1 @例子 2   64 位數據運算 mov r0, #0x0 @ 數據高位 mov r1, #0x4 @ 數據低位 mov r2, #0x1 @ 數據高位 mov r3, #0x3 @ 數據低位 subs r5, r3, r1 @ 數據低位 , subs 表示運算會影響 CPSR 中的狀態位, 3-4是負數,結果為全f的值 sbc r4, r2, r0 @ 數據高位 , sbc 相當於 r4 = r2 - r0 -!C C 為CPSR 中的狀態位

9. 乘法運算指令 【 mul 】 

 【 mov r1, #0x4

 【 mov r2, #0x5

 【 mul r0, r1, r2 】  @ r0 = r1 * r2  

 

四. 邏輯運算指令 : 【 and,orr,eor,bic 】

  指令格式:<opcord><cond>{s} Rd, Rn, operand

  <操作碼><條件碼>{是否影響狀態位}  目標寄存器,第一操作數, 第二操作數

10. 按位與 運算指令 【 and 】

mov r0, #0xaa

mov r1, #0x55

and r3, r0, r1 】   @  r3 = r1 & r2 按位操作 r3中的值為0

 

11. 按位或運算指令 【 orr 】

mov  r1, #0xaa

mov r2, #0x55 】

orr r0, r1, r2 】@ r0 = r1 | r2  把r1 和r2 按位或 結果放在 r0 中, r0中的值為0xff

 

12. 按位異或運算指令 【 eor 】

mov r1, #0x3

mov r2, #0x6

eor r0, r1, r2 】 @  r0 = r1 ^ r2 把r1和r2 中的值異或運算結果放在 r0 中 , r0中的值為0x55

 

13. 位清 0 指令 【 bic 】

ldr r1, =0x12345678 】  @ 低 8 位  0111 1000 

bic r0, r1, #0x55 】      @  0x55 == 0101 0101 ,把 低 8 位 對應的為 1 的地方全部清零 , r0的結果為0x12345628

 

14. 例子:

實現把 0x12345678 中的 6 對應的位置清零 , 清除的是 4 bit 

ldr r0, =0x12345678 @ 需要改變的原始值 mov r1, #0xf @ 需要改多少bit lsl r1, r1, #0x8 @ 把r1 中的值向左移8位在放在r1中 mvn r1, r1 @ 把r1 中的值按位取反后再放在r1中 and r0, r0, r1               @ 把r0 中的值和r1 中的值按位與運算后再放在r0中

 

 

 

五. 數值比價指令

15. 比較指令 【 cmp 】 影響 CSPR 寄存器的 NZC 位

【 mov r0, #0x5 】

【 mov r1, #0x4 】

【 cmp r0, r1 】 @ 本質 做subs 操作 , 影響 CSPR 寄存器的 NZC 位

相等情況                            不相等情況

               

16. 位測試指令 【 tst 】 影響 寄存器 CPSR 的 Z 位

【 mov r0, #0xfe 】

【 mov r1, #0x8 】 

【 tst r0, r1 】 @ 測試某一位是否 為 0 ; 本質上 做 ands 運算;

因為 r0 值為 0xfe == 1111 1110   ; r1 值為 0x8 == 1000 0000 測試 r0 第 7 位 是否為0,r0第7位為1,此時 Z 不置位

改為【 mov r1, #0x1 】

  【 tst r0, r1 】 此時 cpsr 寄存器置位 

 

 17. 測試兩個數是否相等指令 【 teq 】  寄存器 CPSR 的 Z 位

 【 mov r0,  #0xfe 】

 【 mov r1, #0x8 】

 【 teq r0, r1 】 @本質 做 eors操作 ,影響狀態的異或運算 

通過 teq 測試兩個r0 , 和 r1 中的數據是否相等 , 如果相等 置1  Z 位,不相等,清零 Z 位

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM