如何在汇编程序中使用 IF 伪操作处理前向引用

How Do I Handle Forward References with IF Pseudo Ops in an assembler

我正在 Python 中编写一个 6502 汇编器,不知道如何处理:

这是一个两次通过的汇编程序,因此它在第一次通过时计算出符号,然后在第二次通过时填充它们。标准的东西。但!我希望它有一个“.if”伪操作,它将根据条件有条件地执行代码。

如果 .if 伪操作正在测试在第一遍中尚未定义的前向引用符号,我该怎么办?没有它,我无法正确扩展代码来找出标签的位置来确定符号!

我在想也许我可以根据 if 语句是否找到 Truth 来模拟生成符号 table 的多个版本,然后决定在第二遍中使用哪个版本,但这听起来像是糟糕 影响我的表现。

这并不是对你问题的真正回答,更多的是解释为什么你可以完好无损地认输。

考虑以下因素:

.org 0
label1: nop
.if label2 - label1 == 1
        nop
.endif
label2: nop

最后的组装是什么?如果 .if 内的位 excluded 则条件为真,并且 .if 内的位应 included .相反,如果 .if 中的位是 included,则条件为 false,应该排除 .if

我认为限制 .if 使用在代码下方定义的标签是完全合理的。