正如我在问题中提出的那样,
什么是汇编代码编译过程中的一个过程,多亏了解释
答案 0 :(得分:3)
为了生成目标文件,汇编器需要做两件事将每个指令助记符转换成指令字节,例如, add eax, ds:[eax]
至0x0000
。
其中一些很容易做到,因为所有信息都包含在指令中。但是,某些指令引用了指令之外的元素,例如:
如果已经看到跳转目标或内存位置,则没有问题。但是,程序集不会限制您访问已经看到的位置(例如C,它只允许您使用在文件中较早点定义的标识符),因此可能存在标识符不是的情况已知的。例如:
cmp eax, 0
jz skip_this
add eax, edx
skip_this:
mov ecx, eax
在此示例中,遇到skip_this
时未知jz
,因此汇编程序不知道放在那里的地址。
为了构建目标文件,汇编程序一次处理一行的汇编文件。它可以翻译它所能包含的内容,并跟踪它还不知道的内容。到这个阶段结束时,遇到了所有标识符。
当汇编程序完成此阶段时,它会再次处理汇编文件并填充空白。
现在,为了回答您的问题,从头到尾处理整个源文件的每个阶段称为传递。
答案 1 :(得分:0)
“通过”意味着 - 通过源“传递”。回到打卡的日子里,你必须通过装甲/编译器所需的通道来提供卡片。
许多旧的汇编程序是“两次通过”,意味着“套牌”通过一次计算代码偏移,第二次生成代码(当然,它是在卡片上打孔)。
当然,使用更现代的设置,你不会注意到汇编程序是否是10次传递(性能不佳),因为它完全没有磁盘,并且传递之间没有用户交互。
还有“阶段”,编译器(不仅仅是汇编程序)可能是“两阶段”或“三阶段”或更多,具体取决于代码从源到最终对象的转换次数输出