是2传递汇编器和链接器所需的源文件吗?

时间:2011-08-30 06:32:00

标签: linker assembly

我多次听说汇编器和链接器需要遍历其输入文件至少2次,这真的有必要吗?为什么不能一次性完成?

3 个答案:

答案 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)