在u-boot的源码中start.S等汇编文件中用到很多GNU的汇编伪指令,在这把常用的列举一下:
1.GNU 汇编伪指令
- .abort 停止汇编
- .align absexpr1,absexpr2
以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或32. 第二个表达式值表示填充的值 - .if
.else
.endif: 支持条件预编译 - .include “file”: 包含指定的头文件, 可以把一个汇编常量定义放在头文件中
- .comm symbol, length:
在bss段申请一段命名空间,该段空间的名称叫symbol, 长度为length. Ld连接器在连接
会为它留出空间 - .text subsection:切换当前节,即将下面的程序汇编到.text节的编号为subsection的子节中。如未提供subsection,其缺省值为0
- .data subsection: 切换当前节,即将下面的数据汇编到.data节的编号为subsection的子节中。如未提供subsection,其缺省值为0
- .previous:将当前节换回到前一个节与子节,即将下面的指令或数据汇编到当前节之前使用的节与子节中
- .equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间
- .global symbol: 定义一个全局符号, 通常是为ld使用
- .section name [,”flags”,@type,flag_specific_arguments]:切换当前节,即将下面的代码或数据汇编到name节中。其中flag可以是a(节是可分配的),w(节是可写的),x(节是可执行的);type可以是@progbits(节中包含数据),@nobits(节中不含数据,只是占位空间),@note(节中包含注释信息,不是程序).
- .subsection num:切换当前字节,即将下面的代码或数据放在由num指定的子节中,节保持不变.
- .ascii “string”…: 定义一个到多个字符串并为之分配空间,字符串后不自动加0结尾
- .asciz “string”…:定义一个到多个字符串并为之分配空间,字符串后自动加0结尾
- .string “str”:将字符串拷贝到目标文件中,串以0结尾
- .byte expressions: 定义一个字节, 并为之分配空间
- .word expressions: 定义一个字,并为之分配空间, 4 bytes
- .short expressions: 定义一个短整型, 并为之分配空间
- .int expressions: 定义一个整型,并为之分配空间
- .long expressions: 定义一个长整型, 并为之分配空间
- .quad bignums:定义一个1~8字节的长整数
- .fill repeat,size,value:将value值拷贝repeat次,其中每个value中占用size字节
- .space size,fill和.skip size,fill:在目标文件的当前位置处留出size字节的空间,并在其中填入值fill,如未指定fill,则填入0
- .rept count和.endr:将.rept和.endr之间的行重复count次,如:
.rept 0x200
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr - .set symbol,expression:将符号symbol的值设为expression
- .type name,@type:将符号name的type属性设为type。其中type可以是function或object
- .size name,expression:将符号name所占空间设为expression
- .macro: 定义一段宏代码, .macro表示代码的开始, .endm表示代码的结束, .exitm跳出宏, 示例如下:
.macro SHIFTLEFT a, b
.if \b < 0
mov \a, \a, ASR #-\b
.exitm
.endif
mov \a, \a, LSL #\b
.endm - .req register name: 为寄存器定义一个别名
- .code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令
- .arm 表示ARM指令等价于.code32
- .thumb 表示Thumb指令等价于.code16
- .ltorg: 表示当前往下的定义在归于当前段,并为之分配空间
- .org new-lc,fill:从new-lc标识的新位置开始存放下边的代码或数据,之前空出来的空间用fill填充
- .set symbol 声明一个外部符号
- .weak symbol 声明一个弱符号
2.GNU专有符号
- @ 表示注释从当前位置到行尾的字符.
- # 注释掉一整行.
- ; 新行分隔符.
- \ 换行符.
- ‘#’或‘$’直接操作数前缀
3.操作指令
- NOP: nop 空操作, 相当于MOV r0, r0
- LDR: ldr , = 相当于PC寄存器或其它寄存器的长转移
- ADR: adr 相于PC寄存器或其它寄存器的小范围转移
- ADRL: adrl 相于PC寄存器或其寄存器的中范围转移