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

Moc*_*iel 6 x86 assembly nasm

该代码按预期工作:

section .bss
    var2:      DB     ?     
    X:         DW     ?     ; works
Run Code Online (Sandbox Code Playgroud)

如果保留顺序相反,则代码无法汇编:

section .bss
    X:         DW     ?     
    var2:      DB     ?    ; error with lines in other order
Run Code Online (Sandbox Code Playgroud)

即使我没有var2在程序的另一部分使用此标签,我也收到此错误(事实上,这是可重现的将该代码块组装为 3 行文件)。

error: label `var2' changed during code generation [-w+error=label-redef-late]
Run Code Online (Sandbox Code Playgroud)

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

我正在使用 NASM 版本 2.15.04 来汇编此代码(也可以使用 2.15.05 重现)。

Mar*_*lli 6

更新:我的补丁已合并,从 NASM 2.15.06 开始该问题应该不再存在。


经过一些调试和查看源代码后,我可以证实我最初的怀疑:这是一个错误。

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

通常情况下,我会简单地报告该错误,但由于 NASM 的 GitHub 存储库没有活动的“问题”页面,并且他们的 Bugzilla 目前不允许注册,所以我继续提交了拉取请求。修复看起来很简单,除非我遗漏了一些东西,在这种情况下我们会(希望)很快找到答案。