程序的组装和执行 - 两个汇编程序

时间:2016-11-30 18:48:07

标签: c assembly machine-instruction

在阅读有关机器指令和程序的书时,我遇到了一个特定点,即汇编程序扫描整个源程序两次。它在第一次通过/扫描期间构建符号表,并在第二次扫描期间将整个程序与其关联。汇编程序需要以类似的方式为函数提供地址 现在,由于汇编程序两次通过程序,为什么必须先声明一个函数才能使用它?汇编程序是否会在第一遍中为该函数提供一个地址,然后在第二遍期间将其与程序相关联? 在这种情况下我正在考虑C编程。

1 个答案:

答案 0 :(得分:1)

简单的答案是C程序要求在使用之前声明函数,因为C语言被设计为由编译器在单个传递中处理。它与汇编程序和函数地址无关。编译器在使用之前需要知道符号的类型,无论是函数,变量还是其他东西。

考虑这个简单的例子:

int foo() { return bar(); }
int (*bar)();

为了生成正确的代码,编译器需要知道bar不是函数,而是指向函数的指针。只有将extern int (*bar)();放在foo的定义之前,代码才有效,因此编译器知道bar的类型。

虽然理论上该语言可能需要编译器使用两个通道,但这需要对语言设计进行一些重大更改。要求两次传递也会增加编译器所需的复杂性,从而减少可承载C编译器的平台数量。在C首次开发的那一天,这是非常重要的考虑因素,当64K(65,536)字节的RAM是大量内存时。即使在今天,也会对大型程序的编译时间产生明显的影响。

请注意,通过支持隐式函数声明,C语言确实允许您想要的任何内容。 (在上面的示例中,当foo之前没有声明时,bar会发生什么。)但是此功能已过时,有限且被视为危险。