为什么我们不能在 .bss 部分使用 `?` 以任意顺序声明未初始化的变量?

Why can't we declare uninitialized variables in .bss section using `?` in arbitrary order?

此代码按预期工作:

section .bss
    var2:      DB     ?     
    X:         DW     ?     ; works

预订顺序相反,代码不会 assemble:

section .bss
    X:         DW     ?     
    var2:      DB     ?    ; error with lines in other order

我得到了这个错误,即使我没有使用这个标签,var2 在程序的另一部分(事实上,这是可重现的汇编 just该代码块作为一个 3 行文件)。

error: label `var2' changed during code generation [-w+error=label-redef-late]

我认为 var2 变量被 X 变量覆盖,因为它是一个字,占用 2 个字节。

我正在使用 NASM,版本 2.15.04 到 assemble 此代码(也可以用 2.15.05 重现)。

更新:my patch was merged 从 NASM 2.15.06.

起应该不再存在该问题

source code 中进行了一些调试和探索之后,我可以确认我最初的怀疑,即这是一个错误。

Dx ? 形式的指令的大小计算(即包含未初始化存储令牌 ? 的任何 Dx),其中 Dx 大于 DB 内部 returns 错误的大小(假设元素为 1 字节而不是适当的元素大小)。这具有不一致地更改指令后任何标签的段偏移的副作用,导致最终代码生成阶段的不匹配,这被几次检查发现并导致 NASM 错误。

通常我会简单地报告这个错误,但由于 NASM 的 GitHub 回购没有激活“问题”页面并且他们的 Bugzilla 目前不允许注册我继续并提交一个pull request。修复似乎很简单,除非我遗漏了什么,在这种情况下我们会(希望)很快找到答案。