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

我的全栈之路-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 [email protected]
    @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后缀的可执行文件。

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

时间: 2024-12-17 20:44:59

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

我的全栈之路-C语言基础之集成开发环境搭建

我的全栈之路-C语言基础之集成开发环境搭建 我的全栈之路 2.1 C语言集成开发环境搭建 目前主流的操作系统(Windows,Linux,macOS)都有完善的C语言集成开发环境,用于编辑.编译.调试.打包部署C程序. 操作系统 开发工具 Windows10 1903 Visual Studio2019 macOS10.14 XCode10.3 Ubuntu18.04 QT5.13 Windows作为世界上最流行的桌面操作系统,当前最新版本为Windows10 1903,VisualStudio

我的全栈之路-C语言基础之HelloWorld

我的全栈之路-C语言基础之HelloWorld 我的全栈之路 3.1 Visual Studio 2019实现HelloWorld 新建解决方案 在之前创建的Git仓库c-core-programming基础上新建项目 然后选择项目模板:基于C++的空项目 然后设置项目名称.路径以及解决方案名称 新建筛选器 在解决方案资源管理器视图下,选中源文件,然后新建筛选器 新建筛选器 筛选器的名称为Chapter1 Chapter1 新建项 新建源文件helloworld.c 编辑源文件 #include

我的全栈之路-C语言基础之Visual Studio 2019使用技巧

我的全栈之路-C语言基础之Visual Studio 2019使用技巧 我的全栈之路 5.1 Visual Studio 2019调试程序 在后期编写程序时,经验不足的开发人员通常会遇到两种错误:编译错误和运行时错误,编译错误通常是编写的程序不满足编译器的语法规范,而运行时错误则是程序运行时发生的错误,想要排查程序运行时的错误,就需要使用IDE提供的调试功能. 在源文件debug.c中定义一个返回两个整数相乘的方法mul,然后在main函数中定义两个变量,并调用两个整数相乘的方法,输出计算结果

我的全栈之路-Go语言基础之Go语言开发环境搭建

我的全栈之路-Go语言基础之Go语言开发环境搭建 我的全栈之路 2.1 Go语言编译器下载 在开发Go语言的程序之前,首先去官网 golang.google.cn下载Go语言的编译器,编译器的作用就是将开发人员使用Go语言针对Go编译器编写的Go程序编译成对应平台的机器指令.因为计算机无法识别开发人员编写的程序,需要借助Go编译器来将源程序编译成计算机识别的二进制机器指令. golang官网提供了Windows,Linux,macOS版本的Go语言编译下载 当点击Download Go后,会跳转

3Python全栈之路系列之D

Python全栈之路系列之Django模板 模板是一个文本,用于分离文档的表现形式和内容,模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签).模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档. 如何使用模板系统 在Python代码中使用Django模板的最基本方式如下: 可以用原始的模板代码字符串创建一个Template对象,Django同样支持用指定模板文件路径的方式来创建Template对象; 调用模板对象的render方法,并且传入一套

1Python全栈之路系列之MySQL数据库基本操作

Python全栈之路系列之MySQL数据库基本操作 MySQL数据库介绍 MySQL是一种快速易用的关系型数据库管理系统(RDBMS),很多企业都在使用它来构建自己的数据库. MySQL由一家瑞典公司MySQL AB开发.运营并予以支持.它之所以非常流行,原因在于具备以下这些优点: 基于开源许可发布,无需付费即可使用. 自身的功能非常强大,足以匹敌绝大多数功能强大但却价格昂贵的数据库软件. 使用业内所熟悉的标准SQL数据库语言. 可运行于多个操作系统,支持多种语言,包括 PHP.PERL.C.C

1Python全栈之路系列之Tornado Web框架

Python全栈之路系列之Tornado Web框架 Tornado是一个Python web框架和异步网络库,起初由FriendFeed开发. 通过使用非阻塞网络I/O,Tornado可以支撑上万级的连接,处理长连接, WebSockets,和其他需要与每个用户保持长久连接的应用. Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数

1Python全栈之路系列之面向基础

Python全栈之路系列之面向对象基础 面向对象基本介绍 Python编程方式: 面向过程编程 面向函数编程 面向对象编程 名称定义: 如果函数没有在类中称之为函数 如果函数在类中称之为方法 创建类 # 创建一个类,类名是Class_basis class Class_basis:     # 在类里面创建了一个方法ret,类里面的方法必须加一个self关键字     def ret(self):         # 当调用方法的时候输出ret         print("ret")

1Python全栈之路系列Web框架介绍

Python全栈之路系列之Web框架介绍 所有的语言Web框架本质其实就是起一个socket服务端,监听一个端口,然后运行起来 Web框架包含两部分,一部分是socket,另外一部分是业务的逻辑处理,根据请求的不同做不同的处理 Python的Web框架分成了两类, 即包含socket也包含业务逻辑处理的(tornado) 不包含socket(框架本身通过第三方模块实现socket)只包含业务逻辑处理(django,Flask) WSGI的全称是Web Server Gateway Interfa