我多次听说汇编器和链接器需要遍历其输入文件至少2次,这真的有必要吗?为什么不能一次性完成?
答案 0 :(得分:2)
汇编程序将符号汇编语言转换为二进制表示。
在输入语言(汇编程序)中,标签也是符号。
在二进制输出语言中,它们通常是以字节为单位的距离,相对于当前位置或某个其他固定点(例如,向前或向后跳跃这么多字节)。
第一遍只是确定代码开头的偏移量或所有汇编器指令的其他固定点,以确定标签的位置。
这允许计算第二遍中分支指令的正确跳跃距离。
一次通过汇编程序是可能的,但你只能跳转到你已声明的标签(“bacK”)而不是前进。
答案 1 :(得分:1)
有必要的一个例子是当两个函数互相调用时。
int sub_a(int v);
int sub_b(int v);
int sub_a(int v) {
int u = v;
if ( 0 < u ) {
u = sub_b( v - 1 );
}
return u - 1;
}
int sub_b(int v) {
int u = v;
if ( 0 < u ) {
u = sub_a( v - 1 );
}
return u - 1;
}
然后有必要进行两遍扫描。因为函数的任何排序都依赖于尚未扫描的函数。
答案 2 :(得分:1)