Assembly 在解析未来的符号时,两次汇编程序与一次汇编程序有何不同?

Assembly 在解析未来的符号时,两次汇编程序与一次汇编程序有何不同?,assembly,Assembly,以下是我不理解的两个问题: 一次性汇编程序如何解决未来的符号问题 在这方面,双程汇编程序与单程汇编程序有何不同 它是在第一次通过还是第二次通过时解决的?如果它是在第二个过程中完成的,那么它实际上与一个过程的汇编程序有什么不同呢?如果它在第二次传球中成功,为什么它在第一次传球中没有成功 读这个。它一步一步地解释了单程和多程汇编程序是如何工作的。它还解释了两者的优缺点以及两者之间的区别 什么是单程汇编程序? 它是一种Load and go类型的汇编器,通常直接在内存中生成目标代码,以便立即执行!它只

以下是我不理解的两个问题:

  • 一次性汇编程序如何解决未来的符号问题

  • 在这方面,双程汇编程序与单程汇编程序有何不同

    它是在第一次通过还是第二次通过时解决的?如果它是在第二个过程中完成的,那么它实际上与一个过程的汇编程序有什么不同呢?如果它在第二次传球中成功,为什么它在第一次传球中没有成功

  • 读这个。它一步一步地解释了单程和多程汇编程序是如何工作的。它还解释了两者的优缺点以及两者之间的区别

    什么是单程汇编程序? 它是一种Load and go类型的汇编器,通常直接在内存中生成目标代码,以便立即执行!它只解析您的源代码一次,您的代码就完成了。Vroom

    酷,如果它真的有这种魔力,为什么我们需要多道汇编程序呢? 转发参考资料!ie当一次通过的汇编程序在源代码中运行时,它遇到了一些以未定义的数据符号和未定义的标签(跳转地址)形式出现的陌生人。你的装配工问这些陌生人他们是谁?陌生人说“我们稍后再告诉你!”(转发引用)你的汇编程序会生气,并告诉你完全消除这些陌生人。但是这些陌生人是你的朋友,你不能完全消灭他们因此您与汇编程序达成了一项折衷协议。您承诺在使用变量之前定义所有变量。汇编程序在这方面不能妥协,因为它甚至不能为未定义的数据符号保留临时存储,因为它不知道它们的大小。数据可以有不同的大小

    如果是

    PAVAN EQU SOMETHING
    
    ; Your code here
     mov register, PAVAN
    
    
    ; SOMETHING DB(or DW or DD) 80 ; varying size data, not known before
    
    您的汇编器同意在未定义的跳转标签上妥协。因为跳转标签只不过是地址,地址大小可以预先知道,所以汇编程序可以为未定义的符号保留一定的空间

    如果是这样的话

          jump AHEAD
    
    
     AHEAD add reg,#imm
    
    汇编程序将
    向前跳
    转换为
    0x45**0x00 0x00**
    0x45
    jump
    的操作码,为
    前面的
    地址保留了4个字节

    好的,现在告诉我一次汇编程序是如何工作的 很简单,在途中,如果汇编程序遇到未定义的标签,它会将其与未定义符号的值必须放置的地址一起放入符号表中,而在将来找到该符号时。它对所有未定义的标签执行相同的操作,当它看到这些未定义符号的定义时,它会在表中(从而定义该标签)和它先前保留临时存储的内存位置中添加它们的值

    现在,在解析结束时,如果还有更多的可怜的灵魂仍处于未定义状态,汇编程序就会发出“犯规”和“错误”的声音:(如果没有任何未定义的标签,那么就走开

    一秒钟后,我忘了为什么我们需要一个2或多程汇编程序?它们是如何工作的? 如前所述,单道汇编程序无法解析数据符号的正向引用。它要求在使用之前定义所有数据符号。双道汇编程序通过一道专门解析所有(数据/标签)来解决此难题转发引用,然后在下一步中轻松生成目标代码

    如果一个数据符号依赖于另一个,而这另一个又依赖于另一个,那么汇编程序会递归地解决这个问题。如果我在这篇文章中尝试解释这一点,那么这篇文章就会变得太大。阅读这篇文章了解更多细节

    嗯……很有趣。两遍汇编程序还有什么优势吗? 是的,它可以检测到重新定义之类的东西


    PS:我在这里可能不是100%正确。我希望听到任何建议,使它成为一篇更好的文章。

    一个一次性汇编程序生成代码,对于任何未定义的符号,留下一个要填充的槽,并在表或其他数据结构中记住它。然后在定义符号的地方,它在右边填充它的值使用表中的信息放置一个或多个位置

    传统上使用两遍汇编程序的原因是目标程序不适合内存,而不考虑源程序。庞大的源程序是从穿孔磁带读取器逐行读取的,标签表保存在内存中。 (实际上,我已经在ISIS上完成了这项工作,ISIS是英特尔的第一个开发系统,拥有8080处理器。) 第二次从一开始就再次读取源磁带,但所有标签的值都是已知的,并且在读取每一行时,目标程序都会被打孔到磁带上。在内存不足的16位Intel 8086系统上,这仍然是一种有用的技术,可以使用硬拷贝将大量文档化的源文件保存到64 KB以上取代纸带的磁盘或软盘


    现在不需要进行两次传递,但这种体系结构仍在使用。它稍微简单一些,但以I/O为代价。

    考虑汇编程序的一种方法是,想象它们计算分配给顺序增加的内存位置的一系列表达式的值。这些表达式通常由符号的值,对符号、常量和特殊变量(如“当前位置计数器”(通常用“$”等有趣的名称书写)进行的一些运算,或语法为机器指令的真正特殊表达式

    请注意,一个表达式可能会产生一个填充多个顺序内存位置的值;机器指令往往会这样做,但使用字符串文本、多精度数字、初始化结构等的表达式很有用。这只会影响簿记细节,但不会改变汇编程序在抽象中的操作

    计算