『hello, world』 如何运行
来源:互联网 发布:自助设计软件 编辑:程序博客网 时间:2024/06/14 19:20
『hello, world』 如何运行
15 May 2014 http://blog.cyeam.com/computer%20systems:%20a%20programmer's%20perpective/2014/05/15/gcc/
以经典的“hello, world”为例,分析编译的各个阶段。
/* $begin hello */#include <stdio.h>int main() { printf("hello, world\n");}/* $end hello */
预处理阶段。将include要引入的文件载入并替换掉include。将
.c
文件转换为.i
文件。使用gcc
命令加上参数-E
。`gcc -E hello.c -o hello.i`
预处理结束后,生成了845行的hello.i文件。
编译阶段。将
.i
文件编译成.s
文件。`gcc -S hello.i -o hello.s`
将其翻译成汇编语言。
.file "hello.c" .section .rodata .LC0: .string "hello, world" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $.LC0, %edi call puts popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0:.LC0: .size main, .-main .ident "GCC: (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1" .section .note.GNU-stack,"",@progbits
.section .rodata
后面定义了一个只读字符串常量.LC0
,用来储存hello, world
。.text
后面开始是代码区,.globl main
定义了主函数入口。- .cfi_startproc用在每个函数的开始,用于初始化一些内部数据结构。
rbp寄存器是ebp寄存器64位扩展,ebp寄存器扩展基址指针寄存器(extended base pointer) 其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。
以 %r 开头的表示 64-bit 寄存器;以 %e 开头的是 32-bit 寄存器。
pushq,64位,所以是q。保存rbp,以便使用rbp作为栈指针。
- .cfi_endproc在函数结束的时候使用与
.cfi_startproc
相配套使用。 movq %rsp, %rbp
保存栈frame,现在有些编译器开发者致力于优化函数调用,优化这个frame就是其中一项。movl $.LC0, %edi
把字符串”hello, world”的地址放入edi。call puts
打印并且在后面自动追加换行符\n
。
汇编阶段。将上一步生成的汇编代码通过汇编器编译成目标文件
.o
。gcc -c hello.s -o hello.o
链接阶段。将上一步得到的目标文件与
printf.o
链接合并到可执行文件hello
中。编译完成。gcc hello.o -o hello
0 0
- 『hello, world』 如何运行
- hello,world宏观运行
- JVM中的Hello World是如何运行的?
- JVM中的Hello World是如何运行的?
- JVM中的Hello World是如何运行的?
- JVM中的Hello World是如何运行的?
- Hello World程序运行分析
- 命令行下运行hello world
- 运行Groovy 的Hello World
- 『 Hello World 』By Blog
- Hello,world!是如何运行到我的手机的呢
- 深入理解计算机系统(1.2)---hello world的程序是如何运行的
- 深入理解计算机系统(1.1)------Hello World 是如何运行的
- 用Python编写运行Hello World程序
- 1-用线程运行"Hello World"窗体
- Hello World模块的编译和运行
- 备份:官方maemo hello world 运行说明
- 用Python编写运行 Hello World程序
- 选课项目的总结
- C++ static、const和static const 以及它们的初始化
- uboot usb
- Ant : -Xlint:unchecked 和 - encoding 的 解决方式
- 主动访问用户数据 ——被站长忽视的内容
- 『hello, world』 如何运行
- SSH中用到的设计模式之一——单例模式
- HDU 3328 Flipper 栈的应用
- 分数求和
- Linux上mysql服务的安装与配置
- 【cocos2dx 3.2】一个都不能死1 分析
- openwrt中luci学习笔记
- 3-08. 堆栈模拟队列(25)(ZJU_PAT 模拟)
- Cocos2d-x学习笔记(七)-------->Button控件