嵌入式開發筆記(六) ARM匯編指令集基礎2 原

ARM 622瀏覽

ARM匯編指令集基礎2

基本內容回顧:

1. ldr,

  str,

2. mov r0,r1

   mov r0, #0XFF00

   mov r0 ,r1,lsl#3

   ld r0, [r1]

   ld r0,[r1,#4]

   ldmia r0!,{r1-r7,r12}

   stmfd  sp!,{r2-r7,r12}

   beq flag

      flag

3.ldr,ldrb,ldrh,ldrsb,ldrsh,movs

4.moveq,movgt,movlt,

5.流水線

 

常用ARM指令

1:數據處理指令

(1)數據傳輸指令 mov mvn

(2)算術指令 add sub rsb adc sbc rsc

(3)邏輯指令 and orr eor bic

(4)比較指令 cmp cmn tst teq

(5)乘法指令 mvl mla umull umlal smull smlal

(6)前導零計數 clz

    1.2講解:

       1.mov(move) mov r1, r0 兩個寄存器之間數據傳遞

        mov r1, #0xff     將立即數賦值給寄存器

       2.mvn和mov用法一樣,區別是mov是原封不動的傳遞,而mvn是按位取反后傳遞

       按位取反的含義:

   列:r1 = 0x000000ff,然后mov r0, r1 后,r0 = 0xff

                                       mvn r0, r1后,r0=0xffffff00

        3.

        and 邏輯與

        orr 邏輯或

        eor 裸機異或

          4.

        bic 位清除指令

 

bic r0,r1,#0x1f @ 將r1中的數的bit0到bit4清零后賦值給r0 0x1f = 0x0000001f=0x0000```11111

        5.比較指令:

            cmp cmp r0, r1  等價于 sub r2, r0, r1 (r2 = r0 - r1)

            cmn cmn r0, r1  等價于 add r0, r1

            tst tst r0, #0xf 測試r0的bit0~bit3是否全為0

            teq

            比較指令用來比較2個寄存器中的數

            列:tst  r0, #0xf 測試bit0-bit3是否全為0;

 

引用:http://luleimi.blog.163.com/blog/static/17521964520133181756210/

 

注意:比較指令不用后加s后綴就可以影響cpsr中的標志位。

2.cpsr訪問指令

mrs & msr

 

mrs用來讀cpsr,spsr,msr用來寫cpsr,spsr

CPSR寄存器比較特殊,需要專門的指令訪問,這就是mrs和msr。

知識點回顧:

cpsr和spsr的區別和聯系:

cpsr是程序狀態寄存器,

整個SoC中只有1個;而spsr有5個,分別在5種異常模式下,

作用是當從普通模式進入異常模式時,

用來保存之前普通模式下的cpsr的,以在返回普通模式時恢復原來的cpsr。

  列:mrs r0 ,cpsr

        bic r0,r0,#0x1f

        orr r0,r0,#0xd3

        msr cpsr ,r0

msr cpsr_c ,#0xd3  cpsr_c,8個控制位

msr cpsr_cxsf,r1        ;

這里的cxsf表示從低到高分別占用的4個8bit的數據域

指令中有時還有出現cpsr_cf, cpsr_all, cpsr_c等,這里:

        c 指 CPSR中的control field ( PSR[7:0])
        f 指 flag field (PSR[31:24])
        x 指 extend field (PSR[15:8])
        s 指 status field ( PSR[23:16])

其中cpsr的位表示為:
31 30 29 28 ---   7   6   -   4    3   2   1   0
N   Z   C   V         I   F       M4 M3 M2 M1 M0

                                       0     0   0    0   0     User26 模式
                                       0    0   0    0   1     FIQ26 模式
                                       0    0   0    1   0     IRQ26 模式
                                       0    0   0    1   1     SVC26 模式
                                       1    0   0   0   0     User 模式
                                       1    0   0    0   1     FIQ 模式
                                       1    0   0    1   0     IRQ 模式
                                       1    0   0    1   1     SVC 模式
                                       1    0   1    1  1     ABT 模式
                                       1    1  0     1   1     UND 模式

3.跳轉(分支)指令

b & bl & bx

(1)b 直接跳轉(就沒打算返回)

(2)bl   branch and link,跳轉前把返回地址放入lr中,以便返回,以便用于函數調用

(3)bx跳轉同時切換到ARM模式,一般用于異常處理的跳轉。

4.訪存指令

ldr/str & ldm/stm & swp

    單個字/半字/字節訪問 ldr/str

    多字批量訪問  ldm/stm

swp r1, r2, [r0]

swp r1, r1, [r0]

    4.1ARM匯編中的立即數

        (1)合法立即數與非法立即數

     (2)ARM指令都是32位,除了指令標記和操作標記外,本身只能附帶很少位數的立即數。因此立   即 數 有合法和非法之分。

      (3)合法立即數:經過任意位數的移位后非零部分可以用8位表示的即為合法立即數

合法立即數: 0x000000ff 0x00ff0000 0xf000000f

非法立即數: 0x000001ff

5:軟中斷指令

swi(software interrupt)

 

軟中斷指令用來實現操作系統中系統調用

 

七星彩走势图2元网官网