1 ARM GNU 匯編偽指令簡介
(1)abort
.abort 停止匯編
(2)align
.align absexpr1,absexpr2
以某種對齊方式,在未使用的存儲區(qū)域填充值. 第一個值表示對齊方式,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)data
.data subsection: 說明接下來的定義歸屬于subsection數(shù)據(jù)段
(7)equ
.equ symbol, expression: 把某一個符號(symbol)定義成某一個值(expression).該
指令并不分配空間
(8)global
.global symbol: 定義一個全局符號, 通常是為ld使用
(9)ascii
.ascii "string": 定義一個字符串并為之分配空間
(10)byte
.byte expressions: 定義一個字節(jié), 并為之分配空間
(11)short
.short expressions: 定義一個短整型, 并為之分配空間
(12)int
.int expressions: 定義一個整型,并為之分配空間
(13)long
.long expressions: 定義一個長整型, 并為之分配空間
(14)word
.word expressions: 定義一個字,并為之分配空間, 4 bytes
(15)macro/endm
.macro: 定義一段宏代碼, .macro表示代碼的開始, .endm表示代碼的結(jié)束, .exitm
跳出宏, 示例如下:
.macro SHIFTLEFT a, b
.if \b < 0
mov \a, \a, ASR #-\b
.exitm
.endif
mov \a, \a, LSL #\b
.endm
(16)req
name .req register name: 為寄存器定義一個別名
(17)code
.code [16|32]: 指定指令代碼產(chǎn)生的長度, 16表示Thumb指令, 32表示ARM指令
(18)ltorg
.ltorg: 表示當前往下的定義在歸于當前段,并為之分配空間
2 ARM GNU專有符號
(1)@ 表示注釋從當前位置到行尾的字符.
(2)# 注釋掉一整行.
(3); 新行分隔符.
3 操作碼
(1)NOP: nop 空操作, 相當于MOV r0, r0
(2)LDR: ldr <register> , =<expression> 相當于PC寄存器或其它寄存器的長轉(zhuǎn)移
(3)ADR: adr <register> <label> 相于PC寄存器或其它寄存器的小范圍轉(zhuǎn)移
(4)ADRL: adrl <register> <label> 相于PC寄存器或其寄存器的中范圍轉(zhuǎn)移