1. 程式人生 > >ARM常用匯編指令

ARM常用匯編指令

(1)GBLL 偽指令用於定義一個全域性的邏輯變數,並初始化為{False}。

GBLL    BOOTLOADER
BOOTLOADER   SETL    {TRUE}

(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,R2,R3,R4}   ;R1←[R0]
                                   ;R2←[R0+4]
                                  ;R3←[R0+8]
                                  ;R4←[R0+12]
該指令的字尾 IA表示在每次執行完載入/儲存操作後,R0 按字長度增加,因此,指令可將連續儲存單元的值傳送到 R1~R4。

(9)SBC 指令的格式為: 
SBC{條件}{S} 目的暫存器,運算元 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}  ;將暫存器列表中的暫存器(R0,R4 到R12,LR)存入堆疊
LDMFD  R13!,{R0,R4-R12,PC} ;將堆疊內容恢復到暫存器(R0,R4到R12,LR)

(14)ORR 指令的格式為: 
ORR{條件}{S} 目的暫存器,運算元 1,運算元 2
ORR 指令用於在兩個運算元上進行邏輯或運算,並把結果放置到目的暫存器中。運算元 1
應是一個暫存器,運算元 2 可以是一個暫存器,被移位的暫存器,或一個立即數。該指令常用於設定運算元 1 的某些位。 
指令示例: 
ORR   R0,R0,#3             ; 該指令設定R0的0、1位,其餘位保持不變。

(15)BIC 指令的格式為: 
BIC{條件}{S} 目的暫存器,運算元 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 指令。