Assembly 在解析未来的符号时,两次汇编程序与一次汇编程序有何不同?
以下是我不理解的两个问题:Assembly 在解析未来的符号时,两次汇编程序与一次汇编程序有何不同?,assembly,Assembly,以下是我不理解的两个问题: 一次性汇编程序如何解决未来的符号问题 在这方面,双程汇编程序与单程汇编程序有何不同 它是在第一次通过还是第二次通过时解决的?如果它是在第二个过程中完成的,那么它实际上与一个过程的汇编程序有什么不同呢?如果它在第二次传球中成功,为什么它在第一次传球中没有成功 读这个。它一步一步地解释了单程和多程汇编程序是如何工作的。它还解释了两者的优缺点以及两者之间的区别 什么是单程汇编程序? 它是一种Load and go类型的汇编器,通常直接在内存中生成目标代码,以便立即执行!它只
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为代价。考虑汇编程序的一种方法是,想象它们计算分配给顺序增加的内存位置的一系列表达式的值。这些表达式通常由符号的值,对符号、常量和特殊变量(如“当前位置计数器”(通常用“$”等有趣的名称书写)进行的一些运算,或语法为机器指令的真正特殊表达式
请注意,一个表达式可能会产生一个填充多个顺序内存位置的值;机器指令往往会这样做,但使用字符串文本、多精度数字、初始化结构等的表达式很有用。这只会影响簿记细节,但不会改变汇编程序在抽象中的操作
计算