在阅读一本关于机器指令和程序的书时,我遇到了一个特殊的问题,那就是汇编程序扫描整个源程序两次。它在第一遍/扫描期间构建一个符号表,并在第二次扫描期间将整个程序与它关联起来。汇编程序需要以类似的方式为函数提供地址。
现在,由于汇编程序通过了两次程序,为什么需要在可以使用之前声明一个函数呢?汇编程序不会从第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. 汇编8086程序
- 7. NASM汇编程序
- 8. 汇编:编译COM程序
- 9. 微软汇编程序转换为GNU汇编程序
- 10. C++中的汇编程序
- 11. 不明白汇编程序
- 12. 构建汇编程序
- 13. 汇编程序:递归?
- 14. 闰年NASM汇编程序
- 15. 汇编程序安装
- 16. SIC汇编程序I/O
- 17. 调用汇编程序
- 18. x86汇编程序问题
- 19. 汇编语言子程序
- 20. c#汇编程序dll
- 21. 问题汇编C++程序
- 22. windows x64汇编程序?
- 23. 运行此汇编程序的问题
- 24. 汇编程序和C编程linux -m32(从汇编程序中的寄存器中的字符字节)
- 25. 无法运行汇编程序
- 26. GCC运行汇编程序mac?
- 27. 我的第一个汇编程序错误(GCC内联汇编)
- 28. 汇编程序和C++输出文本
- 29. 混合汇编语言和C程序
- 30. 在SASM IDE中编译汇编程序
在什么汇编程序之前,你需要声明一个函数才可以使用? –
C编译器不是汇编器。 C语言的规则与装配工的工作无关。 –
我的意思是说,要被“组装”的编译程序需要对程序包含的每个函数,变量等进行适当的定义。如果汇编程序必须通过程序两次,那么不需要宣布功能是不必要的? –