可以将主题标签“#”用作程序集 (NASM) 中的注释吗?

Und*_*der 2 x86 assembly comments

我正在关注此汇编源代码以进行学习,并遇到以下几行:

# load a disk extent into high memory
# eax - sector address
# ecx - sector count
# edi - destination
load_extent:
    ; loading kernel to 1MiB
    ; move part of kernel to startup_end via bootsector#load and then copy it up
    ; repeat until all of the kernel is loaded
    buffer_size_sectors equ 127
Run Code Online (Sandbox Code Playgroud)

有些行开头#似乎是注释。

然后他跟进标签load_extent:并添加以;.开头的评论。这是我习惯看到的。

这是故意这样做的,所以人们不会不小心复制他的代码?或者我错过了什么?

Ped*_*d7g 6

我浏览了整个NASM 文档,并没有提到哈希是注释字符,但我自己对 NASM v 2.11.08 的实验显示以 开头的行#被视为注释行。所以它看起来像是 NASM 的非官方功能。;文档中只提到了字符。

奇怪的是,该行:

xx: # inc ebx
Run Code Online (Sandbox Code Playgroud)

在标签之后使用哈希的地方将失败并显示“错误:解析器:预期指令”

同样来自 NASM 历史更改列表:“#、@、~ 和 c{?} 现在是标签中的有效字符。” 从 1996 年的 v0.91 开始,因此xx#yy:定义了符号标签xx#yy

这使得它与 sh 脚本有些兼容,并且在为 C 和 NASM 创建混合头文件时可能会被更多地滥用,其中 NASM 将忽略 C 预处理器指令,因此这可能很有用。

但是我建议不要使用它,至少在正式承认这是 NASM 的有意功能之前,而不是解析器的一些错误。


在用完整答案回答这个问题之前,我早期评论中的一些闲聊:

汇编不是单一的编程语言,而是所有机器语言助记符的总称 => 没有规则。

每个 CPU 供应商都有自己的指令集(“ISA”),它需要特定的汇编程序,每个汇编程序供应商都倾向于填补官方文档中缺失的空白(仅描述指令功能,不费心定义完整的编程语言的有效语法),因此即使在同一个 CPU 上,您也可以使用略有不同方言的汇编程序,一个支持 # 作为注释,其他不支持。

在 x86 上,甚至还有语法大不相同的汇编器:AT&T 与 NASM,远远超出了附加的注释开始字符,实际上颠倒了指令的操作数顺序,并为某些指令使用了不同的助记符(例如movzblvs movzx),等等......

例如:在流行的(在大学课程中)MIPS 模拟器“MARS”和“SPIM”#是唯一的注释字符而不是;,但这在他们的官方文档中有详细记录(与 x86 无关)。