GNU ARM彙編偽操作

2021-06-21 13:50:04 字數 3756 閱讀 1572

1、.section

1.1、語法格式

.section section_name[,"

flags

"[,%type[,flag_specific_arguments]]]

1.2、作用

定義乙個段,每乙個段以段名為開始,以下乙個段名或者檔案結尾為結束。

elf格式允許的段標誌: a:可分配

w:可寫段

x:執行段

1.3、舉例

.section .mysection   @自定義資料段,段名為「.mysection」

2、預定義段 .text、.data、.bss

2.1、語法格式

.text 

.data    @初始化資料段

.bss

2.2、作用

.text、.data和.bss將彙編系統預定義的段名編譯到相應的**段、資料段和bss段。

注意:源程式中.bss段應該在.text之前。

2.3、說明

bss段通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域 資料段通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域

2.4、舉例

.section .data 

.section .bss

.section .text .

global

_start

_start:

3、.code16、code32、.thumb、.arm

3.1、語法格式

.code16、code32 

.thumb

.arm

3.2、作用

用來選擇arm或者thumb指令集,.thumb偽操作等同於.code16,表明使用thumb指令類似的.arm等同於.code32

4、.end

4.1、語法格式

.end

4.2、作用

表明原始檔的結束,如果該標號之後還有**,不會被編譯到執行檔案中

5、.include

5.1、語法格式

.include "

filename

"

5.2、作用

可以將指定的檔案在使用位置處展開,一般是標頭檔案

6、.incbin

6.1、語法格式

.incbin "

file

"[,skip[,count]]

6.2、作用

可以將原封不動的乙個二進位制檔案編譯到當前檔案中。其中,skip表明是從檔案開始跳過skip個位元組開始讀取檔案,count是讀取的字數

7、.if、.else/.endif

7.1、語法格式

.if

條件表示式

**段1

.else

**段2

.endif

8、.ifdef,.else和endif

8.1、語法格式

.ifdef 條件表示式  

**段1

.else

**段2

.endif

9、.macro、.exitm和.endm

9.1、語法格式

.macro 巨集名 引數名列表       @偽操作.macro定義乙個巨集  

巨集體 .endm                @.endm表示巨集結束

9.2、說明

如果巨集使用引數,那麼在巨集體中使用該引數時新增字首「\」。巨集定義時的引數還可以使用預設值,可以使用.exitm偽指令來退出巨集

9.3、舉例

.macro shiftleft a,b 

.if \b<0

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

.exitm

.endif

mov \a,\a,lsl #\b

.endm

10、.byte

10.1、語法格式

.byte 表示式...
10.2、作用

定義單位元組

10.3、舉例

.byte

1,2,'

s',0x34

11、.short、.hword

11。1、語法格式

.short/.hword 表示式...
11.2、作用

定義雙位元組資料

11.3、舉例

.short 0x1234

12、.long、.word、.int

12.1、語法格式

.long/.word/.int 表示式...
12.2、作用

.long、.word和.int定義4位元組資料

13、.quad

13.1、語法格式

quad 表示式...
13.2、作用

.quad定義8位元組資料

14、.string/.asciz/.ascii

14.1、語法格式

.string/.asciz/.ascii 表示式...
14.2、作用

.string/.asciz/.ascii定義多個字串。

注意:ascii偽操作定義的字串需要自動新增結尾字元'\0'

14.3、舉例

.string

"abcd

","hello

"

15、.zero、.space、.skip

15.1、語法格式

.zero 

.space/.skip

15.2、作用

分配number_of_bytes位元組的資料空間,.zero偽操作用0填充記憶體,.space/.skip用值為fill_byte填充記憶體,若未指定該值,預設填充0

16、.rept、.endr

16.1、語法格式

.rept 重複次數  

資料定義

.endr       @結束重複定義

16.2、作用

.rept及.endr用於重複定義偽操作

16.3、舉例

.rept 3

.byte

0x23

.endr

17、.equ、.set

17.1、語法格式

.equ(.set)常量名,表示式
17.2、作用

.equ和.set用於為程式中標號定義名稱

17.3、舉例

.equ abc 3

@讓abc=3

18、.global/.globl

18.1、語法格式

.global/.globl symbol
18.2、作用

.global和.globl用來定義乙個全域性的符號

19、.extern

19.1、語法格式

.extern label
19.2、作用

.extern用於宣告乙個外部標號

20、.ltorg、.pool

20.1、語法格式

.ltorg/.pool
20.2、作用

.ltorg和.pool用於宣告乙個資料緩衝池的開始,它可以分配很大的空間

GNU ARM指令偽操作

偽操作 語法格式 作用 常量編譯控制 byte byte expr 分配一段位元組記憶體單元,並用expr初始化 hword short hword expr 分配一段半字記憶體單元,並用expr初始化 ascii ascii expr 定義字串expr 非零結束符 asciz string asc...

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

GNU ARM彙編快速入門

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