GNU ARM 彙編快速入門

2021-06-22 07:48:57 字數 4844 閱讀 2372

以前用arm的ide工具,使用的是arm標準的組合語言。現在要使用gnu的工具,當然要了解一點gnu arm彙編的不同之處。其實非常的簡單,瀏覽一下文件然後再看看程式就完全可以搞定了,或者你硬著頭皮看gnu arm的匯程式設計序,用不了多少時間你就就可以無師自通了。

arm組合語言源程式語句 ,一般由指令、偽操作、巨集指令和偽指令作成。arm組合語言的設計基礎是彙編偽指令,彙編偽操作和巨集指令。

目前常用的arm編譯環境有2種:

armasm: arm公司的ide中使用了codewarrior的編譯器,絕大多數windows下的開發者都在使用這一環境,完全按照arm的規定;

gnu arm asm:gnu工具的arm版本,與armasm略有不同;

gnu arm 彙編快速入門

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

[:] [} @ 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 < 0

mov \a, \a, asr #-\b

.exitm

.endif

mov \a, \a, lsl #\b

.endm

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

補充:

4 arm gnu常用組合語言介紹

4.1 arm gnu常用彙編偽指令介紹

1. abort

.abort: 停止彙編

.align abs-expr1, abs-expr2: 以某種對齊方式,在未使用的儲存區域填充值. 第乙個值表示對齊方式,4, 8,16或32. 第

二個表示式值表示填充的值.

2. if...else...endif

.if.else

.endif: 支援條件預編譯

3. include

.include "file": 包含指定的標頭檔案, 可以把乙個彙編常量定義放在標頭檔案中.

4. comm

.comm symbol, length:在bss段申請一段命名空間,該段空間的名稱叫symbol, 長度為length.      ld聯結器在連線會

為它留出空間.

5. data

.data subsection: 說明接下來的定義歸屬於subsection資料段.

6.      equ

.equ symbol, expression: 把某乙個符號(symbol)定義成某乙個值(expression).該指令並不分配空間.

7. global

.global symbol: 定義乙個全域性符號, 通常是為ld使用.

8. ascii

.ascii "string": 定義乙個字串並為之分配空間.

9. byte

.byte expressions: 定義乙個位元組, 並為之分配空間.

10. short

.short expressions: 定義乙個短整型,      並為之分配空間.

11. int

.int expressions: 定義乙個整型,並為之分配空間.

12 long

.long expressions: 定義乙個長整型, 並為之分配空間.

13 word

.word expressions: 定義乙個字,並為之分配空間, 4bytes.

14. macro/endm

.macro: 定義一段巨集**, .macro表示**的開始, .endm表示**的結束.

15. req

name .req register name:      為暫存器定義乙個別名.

16. code

.code [16|32]: 指定指令**產生的長度, 16表示thumb指令, 32表示arm指令.

17. ltorg

.ltorg: 表示當前往下的定義在歸於當前段,並為之分配空間.

4.2 arm gnu專有符號

1. @

表示注釋從當前位置到行尾的字元.

2. #

注釋掉一整行.

3. ;

新行分隔符.

4.3 操作碼

1. nop

nop空操作, 相當於mov r0, r0

2. ldr

ldr , =

相當於pc暫存器或其它暫存器的長轉移.

3.adr

adr

相於pc暫存器或其它暫存器的小範圍轉移.

adrl

adrl

相於pc暫存器或其暫存器的中範圍轉移.

GNU ARM彙編快速入門

以前用arm的ide工具,使用的是arm標準的組合語言。現在要使用gnu的工具,當然要了解一點gnu arm彙編的不同之處。其實非常的簡單,瀏覽一下文件然後再看看程式就完全可以搞定了,或者你硬著頭皮看gnu arm的匯程式設計序,用不了多少時間你就就可以無師自通了。個人比較健忘,還是把文件翻譯了一下...

GNU ARM彙編快速入門

燕舞龍飛 前言 以 前用arm的ide工具,使用的是arm標準的組合語言。現在要使用gnu的工具,當然要了解一點gnu arm彙編的不同之處。其實非常的簡單,瀏覽一下文件然後再看看程式就完全可以搞定了,或者你硬著頭皮看gnu arm的匯程式設計序,用不了多少時間你就就可以無師自通了。個人比較健忘,還...

ADS ARM 彙編和GNU ARM彙編

linux unix核心源 用的編譯器是gcc,而gcc採用的是at t的彙編格式,這與ads下使用的彙編格式是不同的。兩種彙編格式的部分對比如下 gnu arm彙編 ads arm彙編 或 include get.equ equ.global export extern import long d...