因此,我一直在思考这个问题。这是一个代码示例,然后我将解释它。
:main
dostuff
otherlabel
:otherlabel
dostuff
好吧,在这个例子中,main是代码开始的地方,它“调用”标签'otherlabel'。这实际上只是跳转命令的快捷方式,可以将执行更改为内存中的其他位置。我的问题是,如何处理这些标签,以便在调用它们之前不必声明它们?
目前,我正在直接从源头执行单步编译,并输出字节码。我只是处理标签并在找到它们时将它们添加到字典中。然后我用跳转命令将'otherlabel'替换为代码中的正确位置。但在这种情况下,代码将无法编译。
我想到了几种方法:
首先是在其他任何事情之前处理标签,但这需要我分两步完成所有事情,我必须两次处理相同的代码,这会减慢过程并且看起来像是一团糟。
其次是排队标签调用,直到我完成整个文件并编译其他所有内容然后处理它们,这看起来更清晰。
我在C中写这个,所以我宁愿不实现复杂的数据结构,我正在寻找最直接的方法来处理这个问题。
答案 0 :(得分:5)
使用多次传球。对于脚本语言来说,一次通过是不够的,特别是当您进入更复杂的结构时。
在第一遍中,在编译之前,构建您的标签字典。 在稍后的传递中,当编译发生时,只需使用该字典。
答案 1 :(得分:4)
你可以使用“回调”,虽然听起来就像你已经尝试过的那样;它可以被视为一个复杂的结构。
当您遇到对未定义标签的调用时,您将使用空白地址字段(可能是缓冲区)发出跳转,否则,如果您必须重新读取文件以进行修补,则此选项与“multipass”相同;并且还在字典的“补丁”列表中存储指向空白字段的指针。当您遇到标签定义时,填写列表中的所有空白,然后正常进行。