GNU ARM匯編入門
[
[<標(biāo)簽>:] [<指令>} @ 注釋
GNU ARM 匯編中,任何以冒號(hào)結(jié)尾的都被認(rèn)為是一個(gè)標(biāo)簽,而不一定非要在一行的開始。下面是一個(gè)簡(jiǎn)單的例子,這段匯編程序定義了一個(gè)"add"的函數(shù),該函數(shù)返回兩個(gè)參數(shù)的和:
.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匯編偽指令,并給出了相應(yīng)說明。
.ascii “” 在匯編中定義字符串并為之分配存儲(chǔ)空間(與armasm中的DCB功能類似)。
.asciz “” 和.ascii類似, 但不分配存儲(chǔ)空間。
.balign {, {,} }
以某種排列方式在內(nèi)存中填充數(shù)值。(該指令與armasm中的ALIGN類似)。
power_of_2表示排列方式,其值可為4,8,16或32,單位是byte;
fill_value是要填充的值;
max_padding最大的填充界限,請(qǐng)求填充的bytes數(shù)超過該值,將被忽略。
.byte {,} … 定義一個(gè)或多個(gè)Byte,并為之分配空間(與armasm的DCB類似)。
.code 設(shè)定指令寬度,16表示Thumb,32表示ARM assembly
(和armasm中的CODE16,CODE32相同)。
.if
.else
.endif
預(yù)編譯宏(與armasm中的IF ELSE ENDIF相同)。
.end 匯編文件結(jié)束標(biāo)志,常常省略不用。
.endm 宏結(jié)束標(biāo)志。
.exitm 宏跳出。
.macro {} … {,}
定義一段名為name的宏,arg_xxx為參數(shù)。
必須有對(duì)應(yīng)的.endm結(jié)尾。
可以使用.exitm從中間跳出宏。(與armasm中的MACRO, MEND, MEXIT相同)。
在使用宏參數(shù)時(shí)必須這樣使用:“”。
例如:
[CODE].macro SHIFTLEFT a, b
.if b < 0
MOV a, a, ASR #-b
.exitm
.endif
MOV a, a, LSL #b
.endm
.rept 循環(huán)執(zhí)行.endr前的代碼段number_of_times次。
(與armasm中的WEN相似)
.irp {,} {,} …
循環(huán)執(zhí)行.endr前的代碼段,param依次取后面給出的值。
在循環(huán)執(zhí)行的代碼段中必須以“ ”表示參數(shù)。
.endr 結(jié)束循環(huán)(與armasm中的WEND相似).
.equ , 為一個(gè)標(biāo)號(hào)賦值,類似C中的#define。(與armasm中的EQU相同)
.err 編譯錯(cuò)誤報(bào)告,將引起編譯的終止。
.global 全局聲明標(biāo)志,這樣聲明的標(biāo)號(hào)將可以被外部使用。(與armasm中的EXPORT相同)。
.hword {,} …
插入一個(gè)16-bit的數(shù)據(jù)隊(duì)列。(與armasm中的DCW相同)
.ifdef 如果 被定義,該快代碼將被編譯。以 .endif結(jié)束。
.ifndef 如果 未被定義,該快代碼將被編譯。以 .endif結(jié)束。
.include “” 包含文件。(與armasm中的INCLUDE 或者C中的#i nclude一樣)
定義一個(gè)寄存器,.req的左邊是定義的寄存器名,右邊是使用的真正使用的寄存器。
(與armasm中的RN類似)
例如:acc .req r0
[CODE].section {,””}
開始一個(gè)新的代碼或數(shù)據(jù)段。.text, 代碼段;.data, 初始化數(shù)據(jù)段;.bss, 未初始化數(shù)據(jù)段。
這些段都有缺省的標(biāo)志(flags),聯(lián)接器可以識(shí)別這些標(biāo)志。(與armasm中的AREA相同)。
下面是ELF格式允許的段標(biāo)志
<標(biāo)志> 含義
a 允許段
w 可寫段
x 執(zhí)行段
.set , 變量賦值。(與armasm中的SETA相同)
.space {,}
分配number_of_bytes字節(jié)的數(shù)據(jù)空間,并填充其值為fill_byte,若未指定該值,缺省填充0。
(與armasm中的SPACE功能相同)
.word {,} …
插入一個(gè)32-bit的數(shù)據(jù)隊(duì)列。(與armasm中的DCD功能相同)
GNU ARM匯編特殊字符和語(yǔ)法
代碼行中的注釋符號(hào): ‘@’
整行注釋符號(hào): ‘#’
語(yǔ)句分離符號(hào): ‘;’
直接操作數(shù)前綴: ‘#’ 或 ‘$’
.arm 以arm格式編譯,同code32
.thumb 以thumb格式編譯,同code16
.code16 以thumb格式編譯
.code32 以arm格式編譯
參考資料:
文件: assembler-intro.pdf
文件: GNU-ARM-Assy-Quick-Ref.pdf
評(píng)論