本文记录对于下面 `hello.c` 程序在 Linux 上一次运行系统所发生的事情,内容来源于 CSAPP 第一章。

#include <stdio.h>

int main(int argc, char const *argv[])
{
printf("hello, world\n");
return ;
}

通过下面步骤可以运行这个 C 语言程序:
1. 在命令行中运行 `gcc -o hello hello.c`,生成 hello 可执行文件。
2. 在命令行中输入 `./hello`,屏幕中输出 hello, world 信息。

计算机的 CPU 只能运行设置好的一些操作,如:

  • 加载:把一个字节或一个字从主存复制到CPU寄存器
  • 存储:把一个字节或一个字从CPU寄存器复制到主存的某个位置
  • 操作:把两个寄存器的内容复制到 CPU 的算术逻辑单元 ALU,ALU 对这两个字做算术操作,并把结果放到一个寄存器
  • 跳转:从指令中抽取一个字,复制到程序计数器(PC)中,以覆盖原来的值。

这些预设好的操作一一对应了机器语言中的指令,CPU 只能设别机器语言指令并进行进行操作, C 语言的程序需要运行就需要将 C 语言的代码翻译成机器语言的指令,然后交给 CPU 执行。

第一步中 GCC 编译器驱动程序读取源文件,通过编译系统把它翻译成机器语言的可执行文件。
第二步在命令行输入时,"hello" 字符会被逐一读入CPU寄存器,然后再把它存放到主存中;当在键盘上回车时,命令行外壳会通过操作系统命令调用这个可执行文件,调用可执行文件时,hello 文件首先会从磁盘先拷贝到主存中,然后 hello 文件中的指令一一被 CPU 读取并执行,最终生成的 "hello, world" 字符串被 CPU 从寄存器拷贝到主存,并输出到屏幕中。

最新文章

  1. findViewById返回null
  2. easyui datagrid 没数据时显示滚动条的解决方法
  3. Atitit 面向对象 &#160;封装的实现原理
  4. [BZOJ1999][codevs1167][Noip2007]Core树网的核
  5. jQuery/javascript实现简单网页计算器
  6. (easy)LeetCode 257.Binary Tree Paths
  7. Js字符串与十六进制的相互转换
  8. (Loadrunner)Abnormal termination, caused by mdrv process termination.(转)
  9. 【leetcode】Contains Duplicate &amp; Rectangle Area(easy)
  10. nyoj 129 树的判定
  11. round(x[, n]) : 四舍五入
  12. sql如果存在就修改不存在就新增
  13. Harris角点检测原理分析
  14. Centos常用命令之:文件操作
  15. [从零开始搭网站三]CentOS配置JDK
  16. Servlet笔记7--HttpServletRequest介绍
  17. Mac下百度网盘破解
  18. Netbackup客户端安装网络放通端口需求,及测试网络放通方法
  19. 李洪强漫谈iOS开发[C语言-001]-开发概述
  20. 【JDBC】java程序通过jdbc连接oracle数据库方法

热门文章

  1. Java基础之分支结构循环结构
  2. web设计_8_数据表格内容样式分离
  3. springBoot的过滤器,监听器,拦截器
  4. http状态码 400-499
  5. SpringBoot:如何优雅地处理全局异常?
  6. 2019牛客多校训练第三场H.Magic Line(思维)
  7. 通过wireshark学习Traceroute命令和mtr(UDP,ICMP协议)
  8. .netcore持续集成测试篇之搭建内存服务器进行集成测试一
  9. websocket初体验(小程序)
  10. ReentrantLock源码分析--jdk1.8