在阅读一本关于机器指令和程序的书时,我遇到了一个特殊的问题,那就是汇编程序扫描整个源程序两次。它在第一遍/扫描期间构建一个符号表,并在第二次扫描期间将整个程序与它关联起来。汇编程序需要以类似的方式为函数提供地址。
现在,由于汇编程序通过了两次程序,为什么需要在可以使用之前声明一个函数呢?汇编程序不会从第1遍提供函数的地址,然后在第2遍期间将其与程序关联? 我正在考虑在这种情况下的C编程。程序的汇编和执行 - 两遍汇编程序
0
A
回答
1
简单的答案是,C程序要求函数在可以使用之前被声明,因为C语言被设计为一次编译器处理。它与汇编器和函数的地址没有任何关系。在使用它之前,编译器需要知道符号的类型,无论是函数,变量还是别的东西。
考虑一个简单的例子:
int foo() { return bar(); }
int (*bar)();
为了生成正确的代码编译器需要知道bar
不是一个函数,而是指向函数的指针。该代码仅适用于在foo
的定义之前放置extern int (*bar)();
,以便编译器知道bar
是什么类型。
虽然语言理论上可以设计为要求编译器使用两遍,但这需要语言设计上的一些重大改变。要求两次通过也会增加编译器所需的复杂性,减少可以托管C编译器的平台数量。在C开始开发时,这是非常重要的考虑因素,当64K(65,536)字节的RAM是大量内存时。即使在今天,对大型程序的编译时间也会有明显的影响。
请注意,通过支持隐式函数声明,C语言确实允许你想要什么。 (在我上面的示例中,foo
中的bar
之前没有声明过)。但是,此功能已过时,受到限制并被认为是危险的。
相关问题
- 1. “汇编”与“汇编程序”
- 2. 汇编程序
- 3. Windows如何执行汇编程序?
- 4. 内联汇编程序执行时间
- 5. 不能执行汇编程序
- 6. 汇编程序的第一遍和第二遍教程
- 7. 运行汇编程序
- 8. 汇编8086程序
- 9. NASM汇编程序
- 10. 忽略汇编程序函数的汇编程序关键字
- 11. 汇编:编译COM程序
- 12. 两通汇编程序如何处理由汇编程序扩展的指令?
- 13. 微软汇编程序转换为GNU汇编程序
- 14. 汇编程序中的两个堆栈?
- 15. 寻找一个好的x86汇编程序和反汇编程序库
- 16. C++中的汇编程序
- 17. 汇编程序 - 添加两个变量
- 18. SIC汇编程序I/O
- 19. 不明白汇编程序
- 20. 问题汇编C++程序
- 21. LC3汇编语言程序
- 22. Actionscript 3汇编程序
- 23. Jena tdbloader汇编程序
- 24. c#汇编程序dll
- 25. 汇编程序安装
- 26. 汇编语言子程序
- 27. 汇编程序问题
- 28. BubbleSort与汇编程序
- 29. 汇编程序64b部门
- 30. 汇编程序:递归?
在什么汇编程序之前,你需要声明一个函数才可以使用? –
C编译器不是汇编器。 C语言的规则与装配工的工作无关。 –
我的意思是说,要被“组装”的编译程序需要对程序包含的每个函数,变量等进行适当的定义。如果汇编程序必须通过程序两次,那么不需要宣布功能是不必要的? –