ARM GNU 彙編偽指令簡介

2021-07-11 01:43:14 字數 3022 閱讀 7758

arm gnu 彙編偽指令簡介

1 arm gnu 彙編偽指令簡介

(1)abort

.abort 停止彙編

(2)align

.align ab***pr1,ab***pr2

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

(3)if...else...endif

.if.else

.endif: 支援條件預編譯

(4)include

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

(5)comm

.comm  symbol, length:

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

會為它留出空間

(6)text

.text subsection:切換當前節,即將下面的程式彙編到.text節的編號為subsection的子節中。如未提供subsection,其預設值為0。

(7)data

.data subsection: 切換當前節,即將下面的資料彙編到.data節的編號為subsection的子節中。如未提供subsection,其預設值為0。

(8)previous

.previous:將當前節換回到前乙個節與子節,即將下面的指令或資料彙編到當前節之前使用的節與子節中。

(9)equ

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

(10)global

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

(11)section

.section name [,"flags",@type,flag_specific_arguments]:切換當前節,即將下面的**或資料彙編到name節中。其中flag可以是a(節是可分配的),w(節是可寫的),

x(節是可執行的);type可以是@progbits(節中包含資料),@nobits(節中不含資料,只是佔位空間),@note(節中包含注釋資訊,不是程式).

(12)subsection

.subsection num:切換當前位元組,即將下面的**或資料放在由num指定的子節中,節保持不變.

(13)ascii

.ascii  "string"...: 定義乙個到多個字串並為之分配空間,字串後不自動加0結尾。

(14)asciz

.asciz "string"...:定義乙個到多個字串並為之分配空間,字串後自動加0結尾。

(15)string

.string "str":將字串拷貝到目標檔案中,串以0結尾。

(16)byte

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

(17)word

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

(18)short

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

(19)int

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

(20)long

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

(21)quad

.quad bignums:定義乙個1~8位元組的長整數。

(22)fill

.fill repeat,size,value:將value值拷貝repeat次,其中每個value中占用size位元組.

(23)space 和 skip

.space size,fill和.skip size,fill:在目標檔案的當前位置處留出size位元組的空間,並在其中填入值fill,如未指定fill,則填入0。

(24)rept 和 endr

.rept count和.endr:將.rept和.endr之間的行重複count次。

(25)set

.set symbol,expression:將符號symbol的值設為expression。

(26)type

.type name,@type:將符號name的type屬性設為type。其中type可以是function或object。

(27)size

.size name,expression:將符號name所佔空間設為expression。

(28)macro/endm

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

跳出巨集, 示例如下:

.macro shiftleft a, b

.if \b < 0

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

.exitm

.endif

mov \a, \a, lsl #\b

.endm

(29)req

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

(30)code

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

(31)ltorg

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

(32)org

.org new-lc,fill:從new-lc標識的新位置開始存放下邊的**或資料,之前空出來的空間用fill填充.

2 arm gnu專有符號

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

(2)# 注釋掉一整行.

(3); 新行分隔符.

3 操作碼

(1)nop: nop 空操作, 相當於mov r0, r0

(2)ldr: ldr , = 相當於pc暫存器或其它暫存器的長轉移

(3)adr: adr 相於pc暫存器或其它暫存器的小範圍轉移

(4)adrl: adrl 相於pc暫存器或其暫存器的中範圍轉移

彙編偽指令注釋

彙編偽指令注釋 1 ds 預留儲存區命令 格式 標號 ds 表示式值 其功能是從指定位址開始,定義乙個儲存區,以備源程式使用。儲存區預留的儲存單元數由表示式的值決定。tmp ds 1 從標號tep位址處開始保留1個儲存單元 位元組 2 bit 定義位命令 其功能用於給字元名稱定義位位址。spk bi...

彙編偽指令注釋

1 ds 預留儲存區命令 格式 標號 ds 表示式值 其功能是從指定位址開始,定義乙個儲存區,以備源程式使用。儲存區預留的儲存單元數由表示式的值決定。tmp ds 1 從標號tep位址處開始保留1個儲存單元 位元組 2 bit 定義位命令 其功能用於給字元名稱定義位位址。spk bit p3.7 經...

彙編assume 偽指令

這幾天在看王爽大大的 組合語言。對於assume偽指令卻很是不懂。比如已經定義了assume cs code,ds data 但用debug觀察的時候,發現ds段暫存器卻沒有相關聯的資料。必須在cs中寫明 mov ax,data mov ds,ax 然後才能發現ds中有正確的資料。於是疑惑,assu...