1 ARM GNU 汇编伪指令简介
(1)abort
.abort 停止汇编
(2)align
.align absexpr1,absexpr2
以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,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数据段
(7)equ
.equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该
指令并不分配空间
(8)global
.global symbol: 定义一个全局符号, 通常是为ld使用
(9)ascii
.ascii "string": 定义一个字符串并为之分配空间
(10)byte
.byte expressions: 定义一个字节, 并为之分配空间
(11)short
.short expressions: 定义一个短整型, 并为之分配空间
(12)int
.int expressions: 定义一个整型,并为之分配空间
(13)long
.long expressions: 定义一个长整型, 并为之分配空间
(14)word
.word expressions: 定义一个字,并为之分配空间, 4 bytes
(15)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
(16)req
name .req register name: 为寄存器定义一个别名
(17)code
.code [16|32]: 指定指令代码产生的长度, 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寄存器或其它寄存器的长转移
(3)ADR: adr <register> <label> 相于PC寄存器或其它寄存器的小范围转移
(4)ADRL: adrl <register> <label> 相于PC寄存器或其寄存器的中范围转移