晶元啟動時很多裝置沒有初始化,需要組合語言進行準備。
簡單的gnu彙編語法:
1label :標號,類似於外號,為所在位置做標號,可以通過這個標號訪問這裡的內容所有的以「:」結尾的都被認為是標號label: instruction @ comment
instruction : 指令,包含彙編指令和偽指令
comment : 注釋部分 ,在「@」後面的被認為是注釋,也可以用類似於c語言的 「/*」 和「*/」
arm 中的指令、偽指令、偽操作、暫存器名等可以全部使用大寫,也可以全部使用
小寫,但是不能大小寫混用。
使用者可以使用
.section 偽操作來定義乙個段,彙編系統預定義了一些段名:
.text **段
.data 資料段(初始化的)
.bss 資料段(未初始化的)
.rodata 唯讀資料
我們可以自己使用.section 來定義乙個段,每個段以段名開始,以下一段名或者檔案結尾結束,比如:
1 .section .testsection @定義乙個 testsetcion 段(text/data/bss/rodata)匯程式設計序的預設入口標號是_start,不過我們也可以在鏈結指令碼中使用 entry 來指明其它的入口點
下面的**就是使用_start 作為入口標號:
1上面**中.global 是偽操作,表示_start 是乙個全域性標號,類似 c 語言裡面的全域性變數一樣global _start23
_start:
4 ldr r0, =0x12 @r0=0x12
常見的偽操作有:
gnu 彙編同樣也支援函式,函式格式如下:
1**類似於:函式名:
2函式體
3 返回語句 @非必須
1cortex-a7常用彙編指令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
2、儲存器訪問指令
3、壓棧出棧指令
例如:
1push 和 pop 的另外一種寫法是「stmfd sp!」和「ldmfd sp!」push @將 r0~r3 和 r12 壓棧
14、跳轉指令stmfd sp!, @r0~r3,r12 入棧
2stmfd sp!, @lr 入棧34
ldmfd sp!, @先恢復 lr
5 ldmfd sp!, @再恢復 r0~r3, r12
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...