gpt4 book ai didi

c - 程序的汇编和执行 - 两遍汇编器

转载 作者:行者123 更新时间:2023-11-30 15:03:00 26 4
gpt4 key购买 nike

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

最佳答案

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

考虑这个简单的例子:

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

为了生成正确的代码,编译器需要知道 bar 不是函数,而是指向函数的指针。仅当您将 extern int (*bar)(); 放在 foo 的定义之前,以便编译器知道 bar 是什么类型时,该代码才有效.

虽然该语言理论上可以设计为要求编译器使用两次传递,但这需要对语言的设计进行一些重大更改。需要两次传递还会增加编译器所需的复杂性,从而减少可以托管 C 编译器的平台数量。在 C 语言刚被开发出来的时候,64K (65,536) 字节的 RAM 就已经是很大的内存了,这是非常重要的考虑因素。即使在今天也会对大型程序的编译时间产生显着的影响。

请注意,通过支持隐式函数声明,C 语言确实可以满足您的需求。 (在我上面的示例中,当之前未声明 bar 时,foo 中会发生什么。)但是此功能已过时、有限且被认为是危险的。

关于c - 程序的汇编和执行 - 两遍汇编器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40895951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com