對照Startup s學習ARM彙編指令(轉 )

2021-05-26 07:34:35 字數 3802 閱讀 4341

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

gbll    bootloader

bootloader   setl   

(2)get(或 include)

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

include ..//..//kernel//oal

(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。

(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 指令。

以下指令的疑問:

ldr        r2, =(ebootimagesize/16)    // 加小括號代表什麼?-----位址空間裡存的資料

原文出處:

ARM彙編與C語言對照

開頭宣告 資料初始化 函式 入棧 操作 出棧 被初始化的資料的位址 文字池 注意 和 聯絡比較大,但為了讓 處在不會被執行的地方,所以將 放在 之後。下面的例子是乙個算術運算的彙編與c的對照,首先是c語言 檔名 test.c 說明 算術運算 int v1 1 static int v2 2 int ...

arm 彙編學習

一 暫存器和定址 arm有16個暫存器,r0 r15 pc r15 lr r14 sp r13 ip r12 push sp減少,pop sp增加 1.定址方式 從操作位址尋找運算元的方式 2.arm的定址方式 a 暫存器定址,運算元在暫存器中 b 立即定址,運算元就在指令中 subs r0,r0,...

ARM彙編學習

前言 任何彙編行都是如下結構 comment 注釋 gnu arm 彙編中,任何以冒號結尾的都被認為是乙個標籤,而不一定非要在一行的開始。下面是乙個簡單的例子,這段匯程式設計序定義了乙個 add 的函式,該函式返回兩個引數的和 section text,x global add give the s...