Hexagon Binutils A GNU Manual(6)
2.6 Directives
汇编器指令是源文件中的项目,汇编器将其识别为命令。指令被用来声明部分、常量、数据和符号。它们还可以控制汇编器的功能,如宏和包含文件。
指令以一个句号(.)开始,后面可以跟一个或多个参数。句号后不能出现空格。
比如说:
.set debug, 1
.if debug
汇编器可以识别下列指令。
Sections
1.章节名称
2.章节名称[, “标志”[,类型]] .文本小节
3.数据分节
Symbols
1.equ 符号,expr
2.set 符号, expr
3.equiv 符号,expr
4.global 符号
5.globl 符号
6.common symbol, length [,align] [,access] .comm symbol, length [,align] [, access] .irp symbol, values…
7.irpc符号,值…
8.lcommon 符号,长度 [,对齐] [,访问] .lcomm 符号,长度 [,对齐] [,访问] .symver name, name2@nodename
9.symver name, name2@@nodename
10.symver name, name2@@nodename
11.reloc offset, reloc_name [, expr]。
Symbol attributes
1.size 符号,expr
2.type符号,类型
3.desc 符号,abs-expr
4.隐藏符号[,符号]… .内部符号[,符号]… .保护符号[,符号]…
Alignment
1.org new-lc, fill
2.align[wl] abs-expr [,abs-expr] [,abs-expr].
3.balign[wl] abs-expr [,abs-expr] [,abs-expr] 4.p2align[wl] abs-expr [,abs-expr] [,abs-expr]。
5.falign
Data allocation
1.byte [expr [,expr]…
2.2byte [expr [,expr]…
3.3字节 [expr [,expr]…
4.4字节 [expr [,expr]…
5.word [expr [,expr]…
6.hword [expr [,expr]…
7.半数 [expr [,expr]…
8.short [expr [,expr]…
9.int [expr [,expr]…
10.long [expr [,expr]…
11.octa [bignum [,bignum]… .四[bignum [,bignum]…] .单倍 [flonum [,flonum]… .双数 [flonum [,flonum]…] 。.float [flonum [,flonum]… .ascii [“string” [, “string”]… .asciz [“字符串”[, “字符串”]…] .fill 重复, size, value
12.空格大小, 填充
13.跳过大小, 填充
14.block size, fill
15.string “string” [, “string”]… .string8 “string” [, “string”]… 16.string16 “string” [, “string”]… .string32 “string” [, “string”]… 17.string64 “string” [, “string”]…
Conditionals
1.if abs-expr
2.ifdef symbol
3.ifndef symbol
4.ifnotdef symbol
5.else
6.elseif
7 .endif
Macros
1.macro name
2.macro name argument… .endm
.exitm
3.purgem
4.altmacro
.no5altmacro
Include files
1.include “filename”
Debug
1.file fileno filename
2.loc fileno lineno [column] [options] .stabd type, other, desc
3.stabn type, other, desc, value
4.stabs string, type, other, desc, value .uleb128 expr [,expr]…
5.sleb128 expr [,expr]…
Assembler control
1.end
2.abort
3.err
4.eject
5.rept [count] .endr
Listings
1.list
2.nolist
3.title “heading”
4.sbttl “subheading”
5.psize lines, columns
2.6.1 .2byte
.2byte [expr [,expr]...]
将指定的表达式生成为存储在连续地址中的2字节数据项。接受由逗号分隔的零个或多个表达式。
注意
.2byte等同于.hword(第2.6.34节)。
2.6.2 .3byte
.3byte [expr [,expr]...]
将指定的表达式生成为存储在连续地址中的3字节数据项。接受由逗号分隔的零个或多个表达式。
2.6.3 .4byte
.4byte [expr [,expr]...]
将指定的表达式作为4字节的数据项存储在连续的地址中生成。接受由逗号分隔的零个或多个表达式。
注意
.4byte等同于.word(2.6.77节)。
2.6.4 .abort
.abort
停止装配并退出装配程序。
2.6.5 .align
.align abs-expr [,abs-expr] [,abs-expr]
将位置计数器(在当前分节中)向前推进,直到它是指定表达式值的整数倍。例如,’.align 8’使位置计数器前进,直到它是8的整数倍。
注意
如果当前的位置计数器已经是目标值的整数倍,那么这条指令不做任何事情。
第一个参数(必须是一个绝对表达式)是用字节表示的对齐请求值。这个值必须是2的整数倍,并且不应该超过0x3FFFF。
第二个参数(也是一个绝对表达式)指定了要存储在填充字节中的填充值。如果这个参数被省略,填充字节通常为零,但在文本部分,空间被NOP指令填充。
第三个参数(也是一个绝对表达式)指定了这个对齐指令所要跳过的最大字节数。如果执行对齐指令需要跳过的字节数超过指定值,那么就不执行对齐指令。
注意
第二个参数可以省略,在第一个和第三个参数之间加两个逗号。如果你想在适当的时候用NOP指令来填充对齐方式,这可能很有用。
.align等同于.balign(第2.6.9节)。
2.6.6 .altmacro
.altmacro
在宏处理器中启用下列附加功能(第2.6.45节)。
1.本地名称
2.字符串定界符
3.单字符字符串转义
4.作为字符串的表达式结果
5.字符定界符
这些功能在下面有详细的描述。
注意
可以用.noaltmacro指令(第2.6.46节)来禁用这些附加功能。
这个指令等同于使用–alternate选项(第2.2.2节)。
特殊符号’.'可以用来指定汇编器正在汇编的当前地址。比如说:
Local names
LOCAL name [,name]
LOCAL指令使汇编者(在宏扩展中)用一个独特的汇编者生成的名称来替换每个指定名称的实例。特别是,在每个宏扩展中生成的名称是不同的。这使得在宏中定义符号成为可能,而不必担心产生重复的符号定义。该指令接受一个或多个用逗号分隔的名称。
String delimiters
字符串可以用三种方式划界(而不是通常的一种:
1.“字符串”(双引号定界符–默认值)
2. “string”(单引号定界)。
3.(角括号定界)。
Single-character string escape
任何字符(无论其正常含义如何)都可以通过在字符串前加上’!’(感叹号)而插入。
例如,字符串
<4.2 !> 3.4!!>
产生以下字面意义的文本
<4.2 > 3.4!!>
Expression results as strings
‘%expr’对表达式expr进行评估,并将表达式的结果编码为一个字符串。
Character delimiters
安培符(’&’)可以作为一个分隔符,在宏扩展中被删除。这在宏定义使用汇编语言中具有特殊含义的符号的情况下很有用,否则会妨碍宏的正常扩展。
例如,给定的宏
.altmacro
.macro label l
l&:
.endm
the macro call
label my_label
生成以下文字:
my_label:
而不至于让编译器误认为 "1: “这个字符串本身是一个标签,而不是一个在”: "后面的宏参数。宏参数后的’:’。
2.6.7 .ascii
.ascii ["string" [,"string"]...]
生成指定的字符串字元(没有自动尾随的零字节)作为字符
数据项存储在连续的地址中。
接受由逗号分隔的零个或多个字符串字元(2.3.7节)。
2.6.8 .asciz
与.ascii相同,只是每个字符串后面都有一个零字节。
.asciz ["string" [,"string"]...]
注意
.asciz中的 "z "代表 “零”。
2.6.9 .balign
.balign[wl] abs-expr [,abs-expr] [,abs-expr]
将位置计数器(在当前分节中)向前推进,直到它是指定表达式的值的整数倍。例如,’.balign 8’使位置计数器前进,直到它是8的整数倍。
注意 如果当前的位置计数器已经是目标值的整数倍,那么这条指令就没有任何作用。
第一个参数(必须是一个绝对表达式)是用字节表示的对齐请求值。这个值必须是2的整数倍,并且不应该超过0x3FFFF。
第二个参数(也是一个绝对表达式)指定了要存储在填充字节中的填充值。如果这个参数被省略,填充字节通常为零,但在文本部分,空间被NOP指令填充。
第三个参数(也是一个绝对表达式)指定了这个对齐指令所要跳过的最大字节数。如果执行对齐指令需要跳过的字节数超过指定值,那么就不执行对齐指令。
.balignw and .balignl are variants of .balign:
■ .balignw treats the fill pattern as a two-byte word value
■ .balignl treats the fill pattern as a four-byte longword value
例如,.balignw 4,0x368d对准的是4的倍数。
用单个值0x368d来填充。如果它跳过1或3个字节,则填充值未被定义。
注意 第二个参数可以省略,在第一个和第三个参数之间加两个逗号。如果你想在适当的时候用NOP指令来填充对齐方式,这可能很有用。
2.6.10 .block
.block size, fill
在连续的地址中生成大小字节,每个字节的值为fill。
size和fill都是绝对表达式。如果省略了逗号和fill,fill被认为是零。
.block等同于.space(第2.6.65节)。
2.6.11 .byte
.byte [expr [,expr]...]
将指定的表达式生成为存储在连续地址中的1字节数据项。接受由逗号分隔的零个或多个表达式。
后续未完