码迷,mamicode.com
首页 > 编程语言 > 详细

我的全栈之路-C语言基础之C程序运行流程

时间:2019-08-24 13:04:01      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:ini   width   float   push   pac   gcc   author   cal   12px   

我的全栈之路-C语言基础之C程序运行流程

4.1 C程序的运行流程

C语言编写的程序一般都要经过编写源文件->预处理->编译->汇编->链接后运行这几个流程。
技术图片

  • 预处理
    预处理主要是宏替换、包含头文件、条件编译以及删除注释等操作,预编译阶段生成文件的后缀名通常是.i。
  • 编译
    编译主要是将预处理好的文件生成汇编文件,编译后文件的后缀名通常是.s。
  • 汇编
    汇编主要是将汇编文件生成二进制文件,汇编后的文件的后缀名通常是.o。
  • 链接
    链接主要是将各个二进制文件、库函数、启动代码生成可执行文件。

接下来编写源程序program_running_process.c,然后结合Windows上的GCC编译器提供的各个选项实现预处理、编译、汇编、链接,关于GCC的安装和配置可以参考
Visual Studio Code实现Hello World章节的内容。

#include <stdio.h>
//定义浮点型的常量
#define PI 3.14
/*
    C语言程序的运行流程
    @author tony ittimelinedotnet@gmail.com
    @version  2019/08/20
*/
int main(int argc, char* argv[]) {

    printf("PI =%lf\n", PI);
    return 0;
}

预处理使用 gcc -E 选项即可实现,其中-o表示输出文件的名称

D:\workspace\c\visualstuido2019\c-core-programming\c-core-programming-foundational\c-core-programming-foundational>gcc -E  program_runing_process.c -o program_runing_process.i

预处理完成以后,生成的文件program_running_process.i的大小是54kb
技术图片

当预处理完成以后,定义的常量被替换成实际的值,而#include包含的头文件内容也被复制到预处理的生成的文件中
技术图片

编译通过gcc -S 选项实现

D:\workspace\c\visualstuido2019\c-core-programming\c-core-programming-foundational\c-core-programming-foundational>gcc -S program_runing_process.i -o program_runing_process.s

编译会生成汇编文件

 .file	"program_runing_process.c"
    .text
    .def	__main;	.scl	2;	.type	32;	.endef
    .section .rdata,"dr"
.LC1:
    .ascii "PI =%lf\12\0"
    .text
    .globl	main
    .def	main;	.scl	2;	.type	32;	.endef
    .seh_proc	main
main:
    pushq	%rbp
    .seh_pushreg	%rbp
    movq	%rsp, %rbp
    .seh_setframe	%rbp, 0
    subq	$32, %rsp
    .seh_stackalloc	32
    .seh_endprologue
    movl	%ecx, 16(%rbp)
    movq	%rdx, 24(%rbp)
    call	__main
    movq	.LC0(%rip), %rax
    movq	%rax, %rdx
    movq	%rdx, %xmm1
    movq	%rax, %rdx
    leaq	.LC1(%rip), %rcx
    call	printf
    movl	$0, %eax
    addq	$32, %rsp
    popq	%rbp
    ret
    .seh_endproc
    .section .rdata,"dr"
    .align 8
.LC0:
    .long	1374389535
    .long	1074339512
    .ident	"GCC: (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 7.3.0"
    .def	printf;	.scl	2;	.type	32;	.endef

汇编通过gcc -c 选项实现

D:\workspace\c\visualstuido2019\c-core-programming\c-core-programming-foundational\c-core-programming-foundational>gcc -c program_runing_process.s -o program_runing_process.o

链接gcc没有提供选项,这里只要执行gcc program_running_process.o -o program_running_process.exe就会链接生成可执行文件

D:\workspace\c\visualstuido2019\c-core-programming\c-core-programming-foundational\c-core-programming-foundational>gcc program_runing_process.o -o program_runing_process.exe

windows下的可执行文件后缀名默认是.exe,当然gcc编译器不关心后缀名,如果你的ubuntu或者macOS下安装了gcc,也可以将C程序编译生成.exe后缀的可执行文件。

我的全栈之路-C语言基础之C程序运行流程

标签:ini   width   float   push   pac   gcc   author   cal   12px   

原文地址:https://www.cnblogs.com/ittimeline/p/11404244.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!