所有汇编器伪指令的名称均以点号(.)开头。名称的其余部分由字母组成,通常为小写。
本章讨论 GNU 汇编器在任意目标机器配置下均可使用的伪指令。某些机器配置提供额外的伪指令,详见《机器相关特性》章节。
.abort
此伪指令立即停止汇编。它用于与其他汇编器兼容。原始设计是:汇编语言源程序通过管道输入汇编器。若源程序发送方终止,可用此伪指令告知汇编器一同终止。未来可能不再支持 .abort。
.ABORT
当生成 COFF 输出时,.ABORT 被视为 .abort 的同义词。
当生成 b.out 输出时,汇编器接受此伪指令但忽略它。
.align abs-expr, abs-expr, abs-expr
将当前位置计数器(当前子段)填充至特定存储边界。
- 第一个表达式(必须为绝对表达式)指定所需对齐方式(详见下文)。
- 第二个表达式(亦为绝对表达式)给出填充字节的值。可省略(包括逗号)。若省略,填充字节通常为零。但在某些系统中,若段标记为代码段且填充值省略,则用空操作指令填充。
- 第三个表达式(可选,绝对)指定最大跳过的字节数。若对齐需跳过超过此值的字节,则放弃对齐。若需在合适时用空操作填充,可省略第二个参数,仅保留两个逗号。
对齐方式因系统而异:
- 对于 a29k、hppa、m68k、m88k、w65、sparc、Hitachi SH 及使用 ELF 格式的 i386,第一个表达式以字节为单位对齐(例如 .align 8 使位置计数器对齐至 8 的倍数)。
- 对于其他系统(包括使用 a.out 格式的 i386),第一个表达式表示位置计数器推进后低位零比特的数量(例如 .align 3 对齐至 8 的倍数)。
此差异源于不同原生汇编器的行为,GAS 需模拟它们。GAS 还提供跨架构一致(但 GAS 特有)的 .balign 和 .p2align 伪指令。
.app-file string
.app-file(亦可用 .file)告知汇编器即将开始新逻辑文件。string 为新文件名。通常文件名有无引号均可,但若需指定空文件名,必须使用 ""。此语句未来可能移除,仅为兼容旧程序保留。
.ascii "string"...
接受零或多个字符串字面量(逗号分隔),将每个字符串(无自动尾零字节)汇编至连续地址。
.asciz "string"...
类似 .ascii,但每个字符串后跟零字节。.asciz 中的 "z" 代表 "zero"。
.balign[wl] abs-expr, abs-expr, abs-expr
对齐位置计数器(当前子段)。参数行为与 .align 类似,但第一个表达式固定以字节为单位对齐。
- .balignw 将填充值视为两字节字。
- .balignl 将填充值视为四字节长字。例如 .balignw 4,0x368d 对齐至 4 的倍数,跳过 2 字节则填充 0x368d(具体字节顺序依赖处理器端序)。
.byte expressions
接受零或多个表达式(逗号分隔),将每个表达式汇编至下一字节。
.comm symbol , length
声明名为 symbol 的公共符号。链接时,不同目标文件中的同名公共符号可能合并。若符号未定义(仅存在公共符号),则分配 length 字节未初始化内存。length 必须为绝对表达式。若存在多个同名不同大小的公共符号,按最大尺寸分配。
- ELF 格式下,可指定第三个参数(对齐要求,必须为 2 的幂)。若未指定,对齐方式为不大于符号大小的最大 2 的幂(最大 16)。
- HPPA 语法不同:symbol .comm, length(symbol 可选)。
.data subsection
将后续语句汇编至编号为 subsection(绝对表达式)的数据子段末尾。若省略 subsection,默认为零。
.def name
开始定义符号 name 的调试信息,直至遇到 .endef。仅当配置为生成 COFF 格式时有效。
.desc symbol, abs-expression
设置符号描述符为表达式的低 16 位。仅适用于 a.out 或 b.out 格式,COFF 下接受但无输出。
.dim
编译器生成,用于符号表中包含辅助调试信息,仅允许在 .def/.endef 对内。COFF 格式有效,b.out 下忽略。
.double flonums
接受零或多个浮点数(逗号分隔),汇编为浮点数。具体类型依赖汇编器配置。
.eject
生成汇编列表时强制分页。
.else
条件汇编的一部分,标记当先前 .if 条件为假时需汇编的代码块起始。
.endef
标记由 .def 开始的符号定义结束。仅 COFF 格式有效。
.endif
条件汇编结束标记。
.equ symbol, expression
设置符号值等于表达式,与 .set 同义。HPPA 语法为 symbol .equ expression。
.equiv symbol, expression
类似 .equ,但若符号已定义则报错。等效于:
.ifdef SYM
.err
.endif
.equ SYM,VAL
.err
若汇编至 .err,打印错误信息且不生成目标文件(除非使用 -Z 选项)。
.extern
接受但忽略此伪指令(兼容其他汇编器),所有未定义符号均视为外部。
.file string
同 .app-file。未来可能移除,某些配置已删除以避免冲突。
.fill repeat , size , value
生成 repeat 个 size 字节的副本,内容取自 8 字节数(高 4 字节为零,低 4 字节为 value)。若 size 超过 8,按 8 处理。若省略 value,默认为零;若省略 size,默认为 1。
.float flonums
同 .single,汇编浮点数,类型依赖配置。
.global symbol, .globl symbol
使符号对链接器可见。两种拼写均接受。HPPA 可能需要额外的 .EXPORT。
.hword expressions
汇编 16 位数,同 .short,部分架构下同 .word。
.ident
某些汇编器用于在目标文件中放置标签,GAS 接受但无输出。
.if absolute expression
若表达式非零,则汇编后续代码,结束于 .endif,可选 .else。支持变体:
- .ifdef symbol:符号已定义则汇编。
- .ifndef/.ifnotdef:符号未定义则汇编。
.include "file"
包含文件,搜索路径由 -I 指定,文件名需引号包裹。
.int expressions
汇编表达式为运行时值,字节序和大小依赖目标架构。
.irp symbol,values...
循环赋值 symbol 并汇编代码块,直至 .endr。例如:
.irp param,1,2,3
move d\param,sp@-
.endr
生成三条 move 指令。
.irpc symbol,values...
逐字符赋值 symbol 并汇编代码块。例如:
.irpc param,123
move d\param,sp@-
.endr
同样生成三条 move 指令。
.lcomm symbol , length
为局部公共符号保留 length 字节(BSS 段),初始为零。符号不全局可见。某些目标允许第三个对齐参数。HPPA 语法为 symbol .lcomm, length。
.lflags
接受但忽略此伪指令(兼容性)。
.line line-number
更改逻辑行号(未来可能移除)。AMD29K 下用 .ln 替代。
.linkonce [type]
标记当前段仅链接一次。类型可选:
- discard(默认):静默丢弃重复段。
- one_only:警告但保留一份。
- same_size:大小不同时警告。
- same_contents:内容不同时警告。
仅支持少数格式(如 Windows NT 的 PE 格式)。
.ln line-number
同 .line。
.mri val
val 非零进入 MRI 模式,零退出,影响后续代码直至下一个 .mri 或文件结束。
.list
与 .nolist 配合控制汇编列表生成,内部计数器初始零,.list 增 1,.nolist 减 1,计数器大于零时生成列表。
.long expressions
同 .int。
.macro
定义生成汇编输出的宏。例如:
.macro sum from=0, to=5
.long \from
.if \to-\from
sum "(\from+1)",\to
.endif
.endm
展开 sum 0,5 生成 0 到 5 的 .long。
.macro macname [macargs...]
开始定义宏,参数可指定默认值(如 p1=0)。调用时可按位置或关键字传参。
.endm
结束宏定义。
.exitm
提前退出宏定义。
@
宏内使用,表示已执行宏的次数。
.nolist
控制列表生成,与 .list 配合使用。
.octa bignums
汇编 16 字节整数。
.org new-lc , fill
推进位置计数器至 new-lc(同段表达式),仅能递增。填充字节为 fill(默认为零)。若 new-lc 为绝对表达式,警告后视为同段。
.p2align[wl] abs-expr, abs-expr, abs-expr
对齐方式同 .align,但第一个表达式表示低位零比特数。例如 .p2align 3 对齐至 8 的倍数。
- .p2alignw 用两字节填充,.p2alignl 用四字节填充。
.psize lines , columns
设置列表每页行数(默认 60)和列数(默认 200)。lines 为 0 时仅显式 .eject 分页。
.quad bignums
汇编 8 字节整数,超出部分截断并警告。
.rept count
重复代码块 count 次。例如:
.rept 3
.long 0
.endr
生成三个 .long 0。
.sbttl "subheading"
设置列表子标题(第三行)。
.scl class
设置符号存储类别(仅限 .def/.endef 内),主要用于 COFF。
.section name
将后续代码汇编至指定段。COFF 下用法:
- .section name[, "flags"] 或 .section name[, subsegment]
ELF 下用法: - .section name[, "flags"[, @type]]
标志字符包括 a(可分配)、w(可写)、x(可执行),类型为 @progbits(含数据)或 @nobits(仅占空间)。
.set symbol, expression
设置符号值,同 .equ。HPPA 语法为 symbol .set expression。
.short expressions
通常同 .word,部分架构下不同。
.single flonums
同 .float。
.size
编译器生成,记录符号大小(仅限 .def/.endef 内),COFF 有效。
.sleb128 expressions
生成有符号小端基数 128 格式数(用于 DWARF 调试)。
.skip size , fill
同 .space,填充 size 字节(默认为零)。
.space size , fill
同 .skip,但 HPPA 和 AMD 29K 有特殊行为。
.stabd, .stabn, .stabs
生成调试符号(不在符号表中),字段包括名称、类型、其他属性、描述符、值。
.string "str"
复制字符串到目标文件,自动添加零字节(除非另有规定)。
.symver
绑定符号到特定版本节点(ELF 专用),如:
.symver name, name2@nodename
用于共享库版本控制。
.tag structname
记录结构体类型信息(仅限 .def/.endef 内),COFF 有效。
.text subsection
将后续语句汇编至编号为 subsection 的文本子段末尾(默认为零)。
.title "heading"
设置列表标题(第二行)。
.type int
设置符号类型属性(COFF 有效)。
.val addr
设置符号值属性(COFF 有效)。
.uleb128 expressions
生成无符号小端基数 128 格式数。
.word expressions
汇编表达式为字(大小和字节序依赖目标架构)。
注意:特殊处理以支持编译器
对于地址空间 32 位但寻址小于 32 位的机器,若 .word sym1-sym2 差值超过 16 位,汇编器会创建次级跳转表,调整原 .word 值为符号与长跳转地址的差值。
已弃用伪指令
未来可能移除:.abort, .app-file, .line。