ARM彙編學習

2021-08-05 19:41:36 字數 2869 閱讀 3991

前言:

任何彙編行都是如下結構:

[:] [} @ comment

[:] [} @ 注釋

gnu arm 彙編中,任何以冒號結尾的都被認為是乙個標籤,而不一定非要在一行的開始。下面是乙個簡單的例子,這段匯程式設計序定義了乙個"add"的函式,該函式返回兩個引數的和:

.section .text, 「x」

.global add @ give the symbol add external linkage

add:

add r0, r0, r1 @ add input arguments

mov pc, lr @ return from subroutine

@ end of program

gnu arm彙編偽指令

下面列出了一些gnu arm彙編偽指令,並給出了相應說明。

.ascii 「」 在彙編中定義字串並為之分配儲存空間(與armasm中的dcb功能類似)。

.asciz 「」 和.ascii類似, 但不分配儲存空間。

.balign   }

以某種排列方式在記憶體中填充數值。 (該指令與armasm中的align類似)。

power_of_2表示排列方式,其值可為4,8,16或32,單位是byte;

fill_value是要填充的值;

max_padding最大的填充界限,請求填充的bytes數超過該值,將被忽略。

.byte   … 定義乙個或多個byte,並為之分配空間(與armasm的dcb類似)。  

.code  設定指令寬度,16表示thumb,32表示arm assembly

(和armasm中的code16,code32相同)。

.if  

.else

.endif

預編譯巨集(與armasm中的if else endif相同)。

.end 彙編檔案結束標誌,常常省略不用。

.endm 巨集結束標誌。

.exitm 巨集跳出。

.macro  {} …

定義一段名為name的巨集,arg_***為引數。

必須有對應的.endm結尾。

可以使用.exitm從中間跳出巨集。(與armasm中的macro, mend, mexit相同)。

在使用巨集引數時必須這樣使用:「\」。

例如:

[code].macro shiftleft a, b

.if \b

.rept  迴圈執行.endr前的**段number_of_times次。

(與armasm中的wen相似)

.irp   …

迴圈執行.endr前的**段,param依次取後面給出的值。

在迴圈執行的**段中必須以「\ 」表示引數。

.endr 結束迴圈(與armasm中的wend相似).

.equ ,  為乙個標號賦值,類似c中的#define。(與armasm中的equ相同)

.err 編譯錯誤報告,將引起編譯的終止。

.global  全域性宣告標誌,這樣宣告的標號將可以被外部使用。(與armasm中的export相同)。

.hword   …

插入乙個16-bit的資料佇列。(與armasm中的dcw相同)

.ifdef  如果 被定義,該快**將被編譯。以 .endif結束。

.ifndef  如果 未被定義,該快**將被編譯。以 .endif結束。

.include 「」 包含檔案。(與armasm中的include 或者c中的#i nclude一樣)

.req

定義乙個暫存器,.req的左邊是定義的暫存器名,右邊是使用的真正使用的暫存器。

(與armasm中的rn類似)

例如:acc .req r0

[code].section  

開始乙個新的**或資料段。.text, **段;.data, 初始化資料段;.bss, 未初始化資料段。

這些段都有預設的標誌(flags),聯接器可以識別這些標誌。(與armasm中的area相同)。

下面是elf格式允許的段標誌

含義a 允許段

w 可寫段

x 執行段

.set ,  變數賦值。(與armasm中的seta相同)

.space  

分配number_of_bytes位元組的資料空間,並填充其值為fill_byte,若未指定該值,預設填充0。

(與armasm中的space功能相同)

.word   …

插入乙個32-bit的資料佇列。(與armasm中的dcd功能相同)

gnu arm彙編特殊字元和語法

**行中的注釋符號: 『@』

整行注釋符號: 『#』

語句分離符號: 『;』

直接運算元字首: 『#』 或 『$』

.arm 以arm格式編譯,同code32

.thumb 以thumb格式編譯,同code16

.code16 以thumb格式編譯

.code32 以arm格式編譯

篇後語:

更詳細的使用說明請參照:arm architecture reference manual, addison-wesley isbn 0-201-7371array-1

譯者:

重要的部分翻譯完成了,本人認為不重要的沒有翻譯,如force_thumb,暫存器命名等等。

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...

ARM彙編學習 1

global關鍵字用來讓乙個符號對鏈結器可見,可以供其他鏈結物件模組使用 告訴編譯器後續跟的是乙個全域性可見的名字 可能是變數,也可以是函式名 global start 讓 start 符號成為可見的識別符號,這樣鏈結器就知道跳轉到程式中的什麼地方並開始執行。start是乙個函式的起始位址,也是編譯...