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