为什么我们不能在 .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。修复似乎很简单,除非我遗漏了什么,在这种情况下我们会(希望)很快找到答案。
此代码按预期工作:
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。修复似乎很简单,除非我遗漏了什么,在这种情况下我们会(希望)很快找到答案。