【问题标题】:Why can't we declare uninitialized variables in .bss section using `?` in arbitrary order?为什么我们不能在 .bss 部分中使用 `?` 以任意顺序声明未初始化的变量?
【发布时间】:2021-12-28 21:22:47
【问题描述】:

此代码按预期工作:

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

由于保留顺序相反,代码无法组装:

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

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

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

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

我正在使用 NASM 版本 2.15.04 来组装此代码(也可在 2.15.05 中重现)。

【问题讨论】:

  • 该文档适用于 NASM 的 2.11 版本。您可以从2.15 看到支持? 语法。 ``` 从 NASM 2.15 开始,实现了以下类似 MASM 的功能:A ?声明未初始化存储的参数```
  • 可能是 NASM 中的错误?
  • 出于好奇,如果您将resb 1resw 1 替换为db/dw ?,这是否有效?
  • @Arkku 是的,resbresw 可以正常工作。
  • 好的,现在可以使用 2.15.04 和 .05 的更新代码重现错误,抱歉造成混淆。是的......看起来像一个错误。

标签: assembly x86 nasm


【解决方案1】:

更新:my patch was merged,NASM 2.15.06 中应该不再存在该问题。


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

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

通常我会简单地报告错误,但由于 NASM 的 GitHub 存储库没有活动的“问题”页面,并且他们的 Bugzilla 当前不允许注册,我继续提交了pull request。修复似乎很简单,除非我遗漏了某些东西,在这种情况下,我们会(希望)很快找到。

【讨论】:

  • 很好理解!我会写一篇关于这个错误的博文,我希望你不介意提到你的贡献。
  • @MocanuGabriel 当然可以,很高兴我能提供帮助。如果您需要链接,可以使用我个人资料中的任何链接(so/twitter/website)。
猜你喜欢
  • 1970-01-01
  • 2013-03-05
  • 2014-04-13
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多