📜  C程序如何执行?

📅  最后修改于: 2021-05-25 19:43:20             🧑  作者: Mango

每当编译和执行C程序文件时,编译器都会生成一些与C程序文件同名但具有不同扩展名的文件。那么,这些文件是什么?它们是如何创建的?

下图显示了编译过程以及在编译过程的每个步骤中创建的文件:

每个包含C程序的文件都必须以’.c’扩展名保存。对于编译器来说,这是一个C程序文件是必需的。假设一个程序文件名为first.c。文件first.c称为源文件,该文件保留了程序的代码。现在,当我们编译文件时,C编译器会查找错误。如果C编译器未报告任何错误,则它将文件存储为同名的.obj文件,称为目标文件。因此,这里将创建first.obj。该.obj文件不可执行。链接器继续执行此过程,最后给出一个可执行的.exe文件。

链接器:首先,让我们知道,库函数不是任何C程序的一部分,而是C软件的一部分。因此,编译器不知道任何函数的操作,无论是printf还是scanf。这些函数的定义存储在编译器应能够链接的它们各自的库中。这就是链接器的作用。因此,当我们编写#include时,它包含stdio.h库,该库提供对标准输入和输出的访问。链接器将目标文件链接到库函数,该程序成为一个.exe文件。在这里,将创建可执行文件格式的first.exe。

加载程序:只要我们发出执行特定程序的命令,加载程序便开始工作。加载程序会将.exe文件加载到RAM中,并向CPU告知该程序加载地址的起点。

CPU寄存器

指令寄存器:包含要由CPU执行的当前指令。
程序计数器:包含要由CPU执行的下一条指令的地址。
累加器:它存储与计算有关的信息。

加载程序将第一条指令通知程序计数器并启动执行。然后,程序计数器将处理该任务。

链接器和加载器之间的区别

Linker Loader
Linker generates the executable module of a source program. Loader loads the executable module to the main memory for execution.
Linker takes the object code generated by an assembler, as input. Loader takes executable module generated by a linker as input.
Linker combines all the object modules of a source code to generate an executable module. Loader allocates the addresses to an executable module in main memory for execution.
The types of Linker are Linkage Editor, Dynamic linker. The types of Loader are Absolute loading, Relocatable loading and Dynamic Run-time loading.

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。