4 簡單的 GNU 彙編語法

2022-07-29 01:24:14 字數 2229 閱讀 7291

晶元啟動時很多裝置沒有初始化,需要組合語言進行準備。

簡單的gnu彙編語法:

1

label: instruction @ comment

label :標號,類似於外號,為所在位置做標號,可以通過這個標號訪問這裡的內容所有的以「:」結尾的都被認為是標號

instruction  : 指令,包含彙編指令和偽指令 

comment  : 注釋部分 ,在「@」後面的被認為是注釋,也可以用類似於c語言的 「/*」 和「*/」

arm 中的指令、偽指令、偽操作、暫存器名等可以全部使用大寫,也可以全部使用

小寫,但是不能大小寫混用。

使用者可以使用

.section 偽操作來定義乙個段,彙編系統預定義了一些段名: 

.text      **段

.data    資料段(初始化的)

.bss     資料段(未初始化的)

.rodata    唯讀資料

我們可以自己使用.section 來定義乙個段,每個段以段名開始,以下一段名或者檔案結尾結束,比如: 

1 .section .testsection @定義乙個 testsetcion 段(text/data/bss/rodata)
匯程式設計序的預設入口標號是_start,不過我們也可以在鏈結指令碼中使用 entry 來指明其它的入口點

下面的**就是使用_start 作為入口標號:

1

global _start23

_start:

4 ldr r0, =0x12 @r0=0x12

上面**中.global 是偽操作,表示_start 是乙個全域性標號,類似 c 語言裡面的全域性變數一樣

常見的偽操作有:

gnu 彙編同樣也支援函式,函式格式如下: 

1

函式名:

2函式體

3 返回語句 @非必須

**類似於:

1

/* 未定義中斷 */

2undefined_handler:

3ldr r0, =undefined_handler

4bx r056

7/* svc 中斷 */

8svc_handler:

9ldr r0, =svc_handler

10bx r0

1112

13/* 預取終止中斷 */

14prefabort_handler:

15ldr r0, =prefabort_handler

16 bx r0

cortex-a7常用彙編指令1、處理器內部資料傳輸指令

2、儲存器訪問指令

3、壓棧出棧指令

例如:

1

push @將 r0~r3 和 r12 壓棧

push 和 pop 的另外一種寫法是「stmfd sp!」和「ldmfd sp!」

1

stmfd sp!, @r0~r3,r12 入棧

2stmfd sp!, @lr 入棧34

ldmfd sp!, @先恢復 lr

5 ldmfd sp!, @再恢復 r0~r3, r12

4、跳轉指令

5、算術運算子

6、邏輯運算指令

ARM彙編和Gnu彙編的轉換

將 arm ads 下的彙編碼移植到 gcc for arm 編譯器時,有如下規則 1,注釋行以 或 代替 2,get 或 include include 如 get option.a include option.a 3,equ equ tclk2 equ pb25 equ tclk2,pb25 ...

ARM SDT下彙編到GNU彙編的轉換

將arm sdt下的彙編碼移植到gcc for arm編譯器時,經常要做如下修改 1 注釋行 以 或 代替 2 偽操作符替換 include 替換成 include tclk2 equ pb25 替換成 equ tclk2,pb25 export 替換成 global import 替換成 exte...

ARM SDT下彙編到GNU彙編的轉換

將arm sdt下的彙編碼移植到gcc for arm編譯器時,經常要做如下修改 1 注釋行以 或 代替 2 偽操作符替換 include 替換成 include tclk2 equ pb25 替換成 equ tclk2,pb25 export 替換成 global import 替換成 exter...