该代码按预期工作:
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 重现)。
更新:我的补丁已合并,从 NASM 2.15.06 开始该问题应该不再存在。
经过一些调试和查看源代码后,我可以证实我最初的怀疑:这是一个错误。
大于内部形式的指令Dx ?(即任何Dx包含未初始化存储令牌的指令?)的Dx大小DB计算返回错误的大小(假设元素为 1 字节而不是适当的元素大小)。这会带来副作用,即不一致地更改指令后面的任何标签的段偏移量,从而导致最终代码生成阶段不匹配,该不匹配会被几次检查捕获并导致 NASM 错误。
通常情况下,我会简单地报告该错误,但由于 NASM 的 GitHub 存储库没有活动的“问题”页面,并且他们的 Bugzilla 目前不允许注册,所以我继续提交了拉取请求。修复看起来很简单,除非我遗漏了一些东西,在这种情况下我们会(希望)很快找到答案。