19 ARM彙編自學筆記程式設計之彙編控制

2021-08-03 12:00:00 字數 4601 閱讀 8790

彙編控制(

assembly control

)偽指令

i f、else

、endi f

gbll test  ;宣告乙個全域性的邏輯變數,變數名為 test

if  test = true

指令序列 1

else

指令序列 2

endif

whi le

、wend

gbla counter ;宣告乙個全域性的數學變數,變數名為 counter

count er  seta 3  ;由變數 count er 控制迴圈次數

while counter < 10

指令序列

wend

macro

、mend

$標號  巨集名  $引數 1,$引數 2,⋯⋯

指令序列

mend

mexi t

mexit

mexit 用於從巨集定義中跳轉出去。

其他常用的偽指令

1、 area

語法格式:area  段名  屬性 1,屬性 2,⋯⋯

area 偽指令用於定義乙個**段或資料段。其中,段名若以數字開頭,則該段名需用「|」括起來,如|1_test|。屬性字段表示該**段(或資料段)的相關屬性,多個屬性用逗號分隔。常用的屬性如下:

— code 屬性:用於定義**段,預設為 readonly。

— data 屬性:用於定義資料段,預設為 readwrite。

— readonly 屬性:指定本段為唯讀,**段預設為 readonly。

— readwrite 屬性:指定本段為可讀可寫,資料段的預設屬性為 readwrite。

— align 屬性:使用方式為align 表示式。在預設時,elf(可執行連線檔案)的**段和資料段是按字對齊的,表示式的取值範圍為 0~31,相應的對齊方式為 2 表示式次方。

— common 屬性:該屬性定義乙個通用的段,不包含任何的使用者**和資料。各原始檔中同名的 common 段共享同一段儲存單元。

乙個組合語言程式至少要包含乙個段,當程式太長時,也可以將程式分為多個**段和資料段。使用示例:

area init,code,readonly指令序列;該偽指令定義了乙個**段,段名為 init,屬性為唯讀

2、 ali gn

語法格式:align  }

align 偽指令可通過新增填充位元組的方式,使當前位置滿足一定的對其方式|。其中,表示式的值用於指定對齊方式,可能的取值為 2 的冪,如 1、2、4、8、16 等。若未指定表示式,則將當前位置對齊到下乙個字的位置。偏移量也為乙個數字表示式,若使用該欄位,則當前位置的對齊方式為:2 的表示式次冪+偏移量。使用示例:

area init,code,readonly,alien=3  ;指定後面的指令為 8 位元組對齊。指令序列end

3、 code16、code32

語法格式:code16(或 code32)

code16 偽指令通知編譯器,其後的指令序列為 16 位的 thumb 指令。

code32 偽指令通知編譯器,其後的指令序列為 32 位的 arm 指令。

若在彙編源程式中同時包含arm 指令和 thumb 指令時,可用 code16 偽指令通知編譯器其後的指令序列為 16 位的 thumb 指令,code32 偽指令通知編譯器其後的指令序列為 32 位的 arm 指令。因此,在使用 arm 指令和 thumb 指令混合程式設計的**裡,可用這兩條偽指令進行切換,但注意他們只通知編譯器其後指令的型別,並不能對處理器進行狀態的切換。使用示例:

area init,code,readonly

code32  ;通知編譯器其後的指令為32 位的 arm 指令

ldr  r0,=next+1  ;將跳轉位址放入暫存器 r0

bx  r0 ;程式跳轉到新的位置執行,並將處理器切換到 thumb 工作狀態

code16 ;通知編譯器其後的指令為 16 位的 thumb 指令

next  ldr r3,=0x3ff

end  ;程式結束

4、 entry

語法格式:entry

entry 偽指令用於指定匯程式設計序的入口點。在乙個完整的匯程式設計序中至少要有乙個 entry(也可以有多個,當有多個 entry 時,程式的真正入口點由鏈結器指定),但在乙個原始檔裡最多只能有乙個 entry(可以沒有)。使用示例:

area init,code,readonly

entry ;指定應用程式的入口點

5、 end

語法格式:end

end 偽指令用於通知編譯器已經到了源程式的結尾。使用示例:

area init,code,readonly

end  ;指定應用程式的結尾

6、 equ

語法格式:名稱equ  表示式

equ偽指令用於為程式中的常量、標號等定義乙個等效的字元名稱,類似於c語言中的#define。其中 equ 可用「*」代替。名稱為 equ 偽指令定義的字元名稱,當表示式為 32 位的常量時,可以指定表示式的資料型別,可以有以下三種型別:code16、code32 和 data使用示例:

test  equ 50 ;定義標號 test 的值為 50

addr  equ 0x55,code32  ;定義 addr 的值為 0x55,且該處為 32 位的 arm 指令。

7、 export(或 global)

語法格式:export 標號

export 偽指令用於在程式中宣告乙個全域性的標號,該標號可在其他的檔案中引用。export可用 global 代替。標號在程式中區分大小寫,[weak]選項宣告其他的同名標號優先於該標號被引用。使用示例:

area init,code,readonly

export st est  ;宣告乙個可全域性引用的標號st est

end

8、 i mport

語法格式:import 標號

import 偽指令用於通知編譯器要使用的標號在其他的原始檔中定義,但要在當前原始檔中引用,而且無論當前原始檔是否引用該標號,該標號均會被加入到當前原始檔的符號表中。標號在程式中區分大小寫,[weak]選項表示當所有的原始檔都沒有定義這樣乙個標號時,編譯器也不給出錯誤資訊,在多數情況下將該標號置為 0,若該標號為 b 或 bl 指令引用,則將 b 或 bl指令置為 nop 操作。使用示例:

area init,code,readonly

i mport mai n ;通知編譯器當前檔案要引用標號 mai n,但 mai n在其他原始檔中

定義end

9、 extern

語法格式:extern 標號

extern 偽指令用於通知編譯器要使用的標號在其他的原始檔中定義,但要在當前原始檔中引用,如果當前原始檔實際並未引用該標號,該標號就不會被加入到當前原始檔的符號表中。標號在程式中區分大小寫,[weak]選項表示當所有的原始檔都沒有定義這樣乙個標號時,編譯器也不給出錯誤資訊,在多數情況下將該標號置為 0,若該標號為 b 或 bl 指令引用,則將 b 或 bl指令置為 nop 操作。使用示例:

area init,code,readonly

extern mai n ;通知編譯器當前檔案要引用標號 mai n,但 mai n在其他原始檔中

定義arm 應用系統開發詳解──基於 s3c4510b 的系統設計  9

end

10、  get(或 i nclude)

語法格式:get 檔名

get 偽指令用於將乙個原始檔包含到當前的原始檔中,並將被包含的原始檔在當前位置進行彙編處理。可以使用 include 代替 get。匯程式設計序中常用的方法是在某原始檔中定義一些巨集指令,用 equ 定義常量的符號名稱,用 map和 field 定義結構化的資料型別,然後用 get 偽指令將這個原始檔包含到其他的原始檔中。使用方法與 c 語言中的「include」相似。get 偽指令只能用於包含原始檔,包含目標檔案需要使用 incbin 偽指令使用示例:

area init,code,readonly

get  a1. s ;通知編譯器當前原始檔包含原始檔 a1. s

ge t  c:\a2. s ;通知編譯器當前原始檔包含原始檔 c:\ a2. s

end

11、  i ncbi n

語法格式:incbin 檔名

incbin 偽指令用於將乙個目標檔案或資料檔案包含到當前的原始檔中,被包含的檔案不作任何變動的存放在當前檔案中,編譯器從其後開始繼續處理。使用示例:

area init,code,readonly

i ncbi n a1. dat  ;通知編譯器當前原始檔包含檔案 a1. dat

i ncbi n c:\a2. t xt  ;通知編譯器當前原始檔包含檔案 c:\a2. t xt

end

12、  rn

語法格式:名稱 rn 表示式

rn 偽指令用於給乙個暫存器定義乙個別名。採用這種方式可以方便程式設計師記憶該暫存器的功能。其中,名稱為給暫存器定義的別名,表示式為暫存器的編碼。使用示例:

temp  rn  r0  ;將 r0定義乙個別名 temp

13、  rout

語法格式:  rout

rout 偽指令用於給乙個區域性變數定義作用範圍。在程式中未使用該偽指令時,區域性變數的作用範圍為所在的 area,而使用 rout 後,區域性變數的作為範圍為當前 rout 和下乙個 rout 之間。

ARM彙編程式設計之C程式呼叫匯程式設計序

編寫乙個彙編子程式,實現兩個字資料的加法運算,編寫乙個c程式來呼叫該彙編子程式,並將運算結果使用printf 函式顯示出來。示例如下 為解決這個問題,分別編寫滿足需求的c程式和匯程式設計序。c程式源 define uint32 unsigned int extern uint32 add uint3...

ARM彙編程式設計學習筆記(五)

硬體平台 使用友善之臂mini2440平台。軟體平台 keil 下面直接給出例子和注釋。關於使用keil的一些注意事項,以及除錯的注意事項,放在本文末給出。area led,code,readwrite 宣告乙個 段,可讀寫,名字為led entry 標記下面的指令為入口點 include regi...

ARM彙編和C混合程式設計 筆記

arm復位啟動先執行彙編指令,完成硬體的初始化 為什麼不用c語言?因為c語言無法訪問arm內部的暫存器,例如棧,所以需要彙編來進行初始化 c語言能不能跟彙編相互並且反覆呼叫?不能,因為這樣容易導致區域性變數的混用。彙編呼叫c程式 global start start 將gpj2 3 output l...