ARM常用彙編指令

2021-06-21 06:43:15 字數 3801 閱讀 6254

(1)gbll 偽指令用於定義乙個全域性的邏輯變數,並初始化為。

gbll    bootloader

bootloader   setl   

(2)get(或 include)

get 偽指令用於將乙個原始檔包含到當前的原始檔中,並將被包含的原始檔在當前位置進行彙編處理。可以使用 include 代替 get。

include ..\\..\\kernel\\oal\\startup.s

(3)import 偽指令用於通知編譯器要使用的標號在其他的原始檔中定義,但要在當前原始檔中引用,而且無論當前原始檔是否引用該標號,該標號均會被加入到當前原始檔的符號表中。

import      bootloadermain

import      mmusetup

(4)bl  帶返回的跳轉指令

(5)beq表示「相等則跳轉」,即當cpsr中的z標誌置位時發生跳轉

b   label    ;程式無條件跳轉到標號label處執行 

cmp r1,#0   ;當cpsr暫存器中的z條件碼置位時,程式跳轉到標號label處執行 

beq label   

(6)ldr 指令的格式為: 

ldr 目的暫存器,《儲存器位址》

ldr 指令用於從儲存器中將乙個 32 位的字資料傳送到目的暫存器中。該指令通常用於從儲存器中讀取 32 位的字資料到通用暫存器,然後對資料進行處理。當程式計數器 pc 作為目的暫存器時,指令從儲存器中讀取的字資料被當作目的位址,從而可以實現程式流程的跳轉。

指令示例: 

ldr  r0,[r1]           ;將儲存器位址為r1的字資料讀入暫存器r0。 

ldr  r0,[r1,r2]       ;將儲存器位址為r1+r2的字資料讀入暫存器r0。 

ldr  r0,[r1,#8]      ;將儲存器位址為r1+8的字資料讀入暫存器r0。 

ldr  r0,[r1,r2] ! ;將儲存器位址為r1+r2的字資料讀入暫存器r0,並將新位址r1+r2寫入r1

ldr  r0,[r1,#8] ! ;將儲存器位址為r1+8的字資料讀入暫存器r0,並將新位址r1+8寫入r1。 

ldr  r0,[r1],r2   ;將儲存器位址為r1的字資料讀入暫存器r0,並將新位址r1+r2寫入r1。 

ldr  r0,[r1,r2,lsl#2]!  ;將儲存器位址為r1+r2×4的字資料讀入暫存器r0,並將新位址r1+r2×4寫入r1。 

ldr   r0,[r1],r2,lsl#2   ;將儲存器位址為r1的字資料讀入暫存器r0,並將新位址r1+r2×4寫入r1。

(7)str 指令的格式為: 

str 源暫存器,《儲存器位址》

str 指令用於從源暫存器中將乙個 32 位的字資料傳送到儲存器中。與ldr對應

(8)採用多暫存器定址方式,一條指令可以完成多個暫存器值的傳送。這種定址方式可以用一條指令完成傳送最多 16 個通用暫存器的值。以下指令: 

ldmia   r0,   ;r1←[r0]

;r2←[r0+4]

;r3←[r0+8]

;r4←[r0+12]

該指令的字尾 ia表示在每次執行完載入/儲存操作後,r0 按字長度增加,因此,指令可將連續儲存單元的值傳送到 r1~r4。

(9)sbc 指令的格式為: 

sbc 目的暫存器,運算元 1,運算元 2

sbc指令用於把運算元1減去運算元2,再減去 cpsr 中的c 條件標誌位的反碼,並將結果存放到目的暫存器中。運算元1應是乙個暫存器,運算元2可以是乙個暫存器,被移位的暫存器,或乙個立即數。該指令使用進製標誌來表示借位,這樣就可以做大於 32 位的減法。注意不要忘記設定 s字尾來更改進製標誌。該指令可用於有符號數或無符號數的減法運算。 

指令示例: 

subs  r0,r1,r2     ; r0 = r1 - r2 - !c,並根據結果設定cpsr的進製標誌位

(10)bx  帶狀態切換的跳轉指令

(11)mcr 指令的格式為: 

mcr 協處理器編碼,協處理器操作碼 1,源暫存器,目的暫存器 1,目的暫存器 2,協處理器操作碼 2

mcr 指令用於將 arm 處理器暫存器中的資料傳送到協處理器暫存器中,若協處理器不能成功完成操作,則產生未定義指令異常。其中協處理器操作碼1和協處理器操作碼2為協處理器將要執行的操作,源暫存器為 arm 處理器的暫存器,目的暫存器1和目的暫存器2均為協處理器的暫存器。 

指令示例: 

mcr   p3,3,r0,c4,c5,6    ;該指令將arm處理器暫存器r0中的資料傳送到協處理器p3的暫存器c4和c5中。 

(12)cmp 指令的格式為: 

cmp 運算元 1,運算元 2 

cmp 指令用於把乙個暫存器的內容和另乙個暫存器的內容或立即數進行比較,同時更新 cpsr 中條件標誌位的值。該指令進行一次減法運算,但不儲存結果,只更改條件標誌位。標誌位表示的是運算元 1 與運算元 2 的關係(大、小、相等),例如,當運算元 1 大於操作運算元 2,則此後的有 gt 字尾的指令將可以執行。 

指令示例: 

cmp r1,r0  ;將暫存器r1的值與暫存器r0的值相減,並根據結果設定cpsr的標誌位 

cmp r1,#100 ;將暫存器r1的值與立即數100相減,並根據結果設定cpsr的標誌位

(13)批量資料載入/儲存指令ldm(或 stm)指令的格式為: 

ldm(或 stm) 基址暫存器,暫存器列表

ldm(或 stm)指令用於從由基址暫存器所指示的一片連續儲存器到暫存器列表所指示的多個暫存器之間傳送資料,該指令的常見用途是將多個暫存器的內容入棧(sdm)或出棧(ldm)。其中,為以下幾種情況: 

ia  每次傳送後位址加 1; 

ib  每次傳送前位址加 1; 

da  每次傳送後位址減 1; 

db  每次傳送前位址減 1; 

fd  滿遞減堆疊; 

ed  空遞減堆疊; 

fa  滿遞增堆疊; 

ea  空遞增堆疊; 

為可選字尾,若選用該字尾,則當資料傳送完畢之後,將最後的位址寫入基址暫存器,否則基址暫存器的內容不改變。

stmfd  r13!,  ;將暫存器列表中的暫存器(r0,r4 到r12,lr)存入堆疊

ldmfd  r13!, ;將堆疊內容恢復到暫存器(r0,r4到r12,lr)

(14)orr 指令的格式為: 

orr 目的暫存器,運算元 1,運算元 2

orr 指令用於在兩個運算元上進行邏輯或運算,並把結果放置到目的暫存器中。運算元 1

應是乙個暫存器,運算元 2 可以是乙個暫存器,被移位的暫存器,或乙個立即數。該指令常用於設定運算元 1 的某些位。 

指令示例: 

orr   r0,r0,#3             ; 該指令設定r0的0、1位,其餘位保持不變。

(15)bic 指令的格式為: 

bic 目的暫存器,運算元 1,運算元 2 

bic指令用於清除運算元1 的某些位,並把結果放置到目的暫存器中。運算元 1 應是乙個暫存器,運算元 2 可以是乙個暫存器,被移位的暫存器,或乙個立即數。運算元 2 為 32 位的掩碼,如果在掩碼中設定了某一位,則清除這一位。未設定的掩碼位保持不變。 

指令示例: 

bic   r0,r0,#%1011     ; 該指令清除 r0 中的位 0、1、和 3,其餘的位保持不變。

(16)

adr(小範圍的位址讀取偽指令)

adrl(中等範圍的位址讀取偽指令)

ldr(大範圍的位址讀取偽指令)

ldr     r0, =0xffffc000

用於將基於pc的位址或基於暫存器的位址讀取到暫存器中。

///偽指令通過彙編編譯器替換成對應的arm/thumb 指令。

ARM架構常用彙編指令

博主自己的學習筆記,順便分享。不是教科書,有錯誤很正常,請指出,日後會修改。str r0,r1 r1是位址,將r0資料存放到r1指向的位址 str r0,r1,0x10 將r0資料寫入以r1 0x10為位址的儲存器中,r1不變 str r0,r1 0x10 將r0資料寫入以r1 0x10為位址的儲存...

ARM常用彙編指令介紹

b 跳轉指令 跳轉範圍為32mb pc 暫存器r15,程式計數器指向當前執行的程式位址 ldr 從記憶體中讀取資料載入到暫存器中 str 將暫存器中的資料儲存到記憶體 mov 暫存器與暫存器之間的資料傳送指令,也可以將立即數傳給目標暫存器 add 加法指令 sub 減法指令 bic 位清除指令 or...

cmp 位元組 彙編 Arm常用彙編指令

1.單暫存器載入指令 ldr ldr r0,r1 r0 載入字指令 ldr r0,r1 將記憶體中的乙個字 4個位元組 載入到暫存器r0中 載入位元組指令 ldrb r0,r1 將記憶體中的乙個位元組載入到暫存器r0中 有符號數載入位元組指令 ldrsb r0,r1 這條指令與上一條指令的不同之處在...