assembly 在古代NASM版本中报告为“重新定义”的通用符号(0.98.39)

pnwntuvh  于 2023-02-04  发布在  其他
关注(0)|答案(2)|浏览(125)

我尝试用NASM 0.98.39编译这个源代码(已经精简到最小):

common foo 2:near
mov word [bx], foo
dummy:

出乎意料的是,我收到错误消息:

$ nasm-0.98.39 -O9 -f obj -o tt.obj tt.nasm  
tt.nasm:1: error: symbol `foo' redefined

新版本的NASM(例如2.13.02)成功。
有没有办法让它与NASM 0.98.39一起工作?
请注意,对于生产项目,升级NASM不是一个选项,因为较新的版本在某些极端情况下会生成不同的机器码。
请注意,将优化标志从-O9更改为-O0会使优化成功,但这不是生产项目的选项。

qnakjoqk

qnakjoqk1#

有没有办法让它与NASM 0.98.39一起工作?
不,没有。当然,你可以,而且肯定是一个相当快的解决方案,升级nasm

  • 尝试解决优化中不希望出现的偏差(插入strict),或
  • 简单地以db表示法转储期望的机器代码。

是的,我很乐意有个变通办法。
OMF是一种相当简单的数据格式。你可以在一个小时内阅读所有必要的文档,并在一天内编写一个补丁程序。然后你可以在nasm源代码中使用extern来代替common,你的补丁程序会解决这个问题。

slwdgvem

slwdgvem2#

这是另一种解决方法:拆分源文件,并链接两个.obj文件:
源文件1(extern s +所有代码和数据):

extern foo
mov word [bx], foo
dummy:

源文件2(仅common s):

common foo 2:near

相关问题