官术网_书友最值得收藏!

3.3 常用ARM指令

3.3.1 內存訪問指令

1.基本指令

ldr:存儲器memory中數(shù)據(jù)傳送到寄存器register

str:寄存器register中數(shù)據(jù)傳送到存儲器memory

例如:

      ldr  r0, [r1]           ;  r1作為指針,該指針指向的數(shù)存入r0
      str  r0, [r1, #4]      ;  r1+4作為指針,r0的值存入該地址
      str  r0, [r1, #4]!   ;  同上,并且r1 = r1 + 4
      ldr  r1, =0x08100000   ; 立即數(shù)0x08100000存到r1
      ldr  r1, [r2],  #4      ; r2+4作為指針,指向的值存入r1,并且r2=r2+4

2.多字節(jié)存取指令

多字節(jié)存取指令常應用于堆棧操作。

ldm:存儲器memory中數(shù)據(jù)傳送到多個寄存器

stm:多個寄存器中的數(shù)據(jù)傳送到存儲器memory

例如:

      sub  lr,lr, #4    ;lr-4是異常處理完后應該返回的地方
      stmfd   sp! , {r0-r12, lr};保存r0~r12和lr寄存器的值到堆棧并更新堆棧指針。
      ldmfd   sp! , {r0-r12, pc}^  ;從堆棧中恢復r0~r12,返回地址賦給pc指針,使程序返回
  到異常發(fā)生前所執(zhí)行的地方,^標記用來使CPU退出異常模式,進入普通狀態(tài)。

3.3.2 算術運算指令

基本指令:

add:加法指令

sub:減法指令

例如:

    add  r0,r1, r2          ; r0 = r1 + r2
    adds r0,r1, #0x80       ; r0 = r1 + 0x80,并設置狀態(tài)寄存器
    subs r0,r1, #2000        ; r0 = r1-2000,并設置狀態(tài)寄存器

3.3.3 邏輯運算指令

基本指令:

and:與指令

orr:或指令

eor:異或

bic:位清0

例如:

      ands r0, r1, #0xff00         ; r0 = r1 and 0xff00,并設置狀態(tài)寄存器
      orr  r0,r1, r2              ; r0 = r1 and r2
      bics r0,r1, #0xff00         ; r0 = r1 and ! (0xff00),高8位清零

3.3.4 mov指令

例如:

      mov  r0, #8 ; r0 = 8
      mov  r0,r1  ; r0 = r1

mov不同于LDR、STR指令,mov指令可以在寄存器間賦值,LDR用于把內存中數(shù)據(jù)裝載到寄存器,而STR用于把寄存器中的數(shù)據(jù)裝載到內存中。

3.3.5 比較指令

基本指令:

cmp:比較兩個操作數(shù),并設置狀態(tài)寄存器

例如:

      cmp  r0,r1 ;計算r0- r1,并設置狀態(tài)寄存器,判斷r0是否大于、小于或等于r1
      cmp  r0,#0  ;

3.3.6 跳轉指令

基本指令:

b:跳轉

bl:跳轉并將下一指令的地址存入lr寄存器

例如:

      loop1
      …
      b    loop1           ; 跳到地址loop1處
      bl   sub1            ; 將下一指令地址寫入lr,并跳至sub1

        …
        sub1
        …
        mov  pc ,   lr          ; 從sub1中返回,保存pc指針的是通用寄存器r15,連接寄存器
    r14(lr)執(zhí)行有返回的跳轉指令bl時,系統(tǒng)將PC保存到r14中。

3.3.7 條件執(zhí)行指令

條件:狀態(tài)寄存器中某一或某幾個比特的值代表條件,對應不同的條件后綴cond。

例如:

      ;跳轉代碼
      cmp  r0, r1    ;比較r0和r1
      blgt sub1      ;如果r0>r1,跳轉到sub1,否則不操作

在這段程序代碼中,通過指令cmp比較r0與r1寄存器的值,如果r0>r1,跳轉到sub1,否則不操作。

例如:

      ;一段循環(huán)代碼
      ldr  r2, =8      ; r2 = 8
      loop
      ;這里可以進行一些循環(huán)內的操作
      subs     r2,     r2,     #1      ; r2 = r2-1,并設置狀態(tài)位
      bne      loop                   ;如果r2不等于0,則繼續(xù)循環(huán)

在這段程序代碼中,通過指令cmp比較與寄存器r2是否為0,如果r2不等于0,則跳轉到loop繼續(xù)循環(huán)。

      mov      r0,     #1              ; r0 = 1
      cmp      r2,     #8             ;比較r2和8
  movlt   r0,     #2             ;如果r2<8, r0 = 2

在這段程序代碼中,通過指令cmp對r2的值與8比較,指令movlt中表明如果r2<8,則把值2賦給r0。

主站蜘蛛池模板: 科技| 红桥区| 射洪县| 丰城市| 肃北| 望奎县| 鞍山市| 右玉县| 北流市| 阿拉善盟| 宝鸡市| 白河县| 百色市| 通城县| 六安市| 呼伦贝尔市| 孙吴县| 东光县| 栾城县| 双柏县| 土默特左旗| 宝应县| 喀什市| 陆良县| 安陆市| 茌平县| 三门峡市| 政和县| 黑水县| 安龙县| 湘潭县| 克什克腾旗| 贡觉县| 肥城市| 牙克石市| 雷波县| 禹州市| 阿拉善右旗| 旬阳县| 繁峙县| 五大连池市|