摘 要
经过一个学期的学习,再回顾初试编程时打出的hello
world程序,我们能够更加理解hello程序人生的所有关键节点。通过这种梳理,完成对整个学期的学习内容的回顾。我们运用了Ubuntu下的编程与调试工具,通过细致的分析,加深对与计算机系统知识的掌握。
关键词:hello world;程序人生;计算机系统;Ubuntu;
(摘要0分,缺失-1分,根据内容精彩称都酌情加分0-1分)
目 录
第1章 概述
1.1 Hello简介
P2P:
即Program to Process:
-
Program: 在编辑器中编写代码得到的hello.c源程序
-
Process:
hello.c在Ubuntu系统中使用cpp进行与粗粒,使用ccl进行编译,使用as进行汇编,使用ld进行连接,最获得了可执行的目标文件hello。并可以通过使用shell键入文件名,执行程序获得进程。
020:
即在虚拟内存中申请并映射虚拟内存,最终释放所有资源的过程。
-
Shell获得了hello的文件名之后,调用fork函数,然后为hello进程执行execve,将执行文件内容映射到虚拟内存
-
进入程序的入口,载入物理内存,并进行时间片的分配,并执行逻辑控制流。
-
当程序运行结束之后,sell作为父进程回收hello进程所分配的资源,最后内核删除相关的数据结构。
1.2 环境与工具
硬件环境:
处理器:Intel® Core™ i5-8250U CPU @1.60GHz,1800 Mhz,4个内核,8个逻辑处理器
RAM:8.00GB
系统类型:64位操作系统,基于x64的处理器。
软件环境:Windows 10 64位,Ubuntu 20.04
开发与调试工具:gcc, as, ld, visual studio code, edb , readelf, objdump
1.3 中间结果
文件类型 | 文件名 |
---|---|
预处理之后得到的文件 | hello.i |
编译之后得到的文件 | hello.s |
汇编之后的可重定位目标文件 | hello.o |
链接之后的可执行目标文件 | Hello |
hello.o ELF格式代码 | Elf_hello.txt |
hello.o反汇编代码 | Disas_hello.s |
hello的ELF格式 | hello.elf |
hello的反汇编代码 | hello_objdump.s |
1.4 本章小结
本章介绍了P2P,020的含义和大致流程,介绍了大作业中所使用的硬件,软件环境和开发工具,最后简述了从.c文件到可执行文件还有调试过程中所经历的过程文件。
(第1章0.5分)
第2章 预处理
2.1 预处理的概念与作用
概念:
预处理会解释预处理指令,即以#开始的行的内容,其中ISO
C/C++支持了#if,#ifdef,#ifndef,#else,#elif,#endif,#define,#include,#line,#error,#gragma,#。源代码中因为有了预处理指令,可以在不同的执行环境中被方便地兼容下来并且被修改和编译。
作用:
-
#include形式将后面声明地文件内容复制到新的程序中,hello.c中的#include<stdio.h>使得预处理器读取头文件stdio.h等内容,并将其插入到.c源程序代码文本之中。
-
在预处理阶段,#define后面的用空白字符分割的两个字符串中的前者,会在整个文件中的所有出现被后者代替。
-
会根据#if后面的条件限定后续需要编译的代码。
-
可以替换掉一些特殊的符号,并用合适的值进行替换。
2.2在Ubuntu下预处理的命令
运行的指令:
Linux>cpp hello.c > hello.i
图2-1
2.3 Hello的预处理结果解析
程序的长度被大大拓展了。头文件中的内容代替了原来的include预处理指令的位置。并且在这些头文件之中的预处理指令也被递归地进行了处理。最终的.i文件将不包含任何的include,define等预处理指令,预编译程序识别出了一些特殊符号,并对这些特殊符号的出现使用合适的只进行替换。
图2-2
本章小结
本章介绍了预处理的意义和过程,包括头文件的展开,注释的去掉,条件编译,宏替换等,以及Ubuntu下进行预处理的指令,最后我们对hello.c的文件的与处理结果hello.i进行了分析,更加透彻的了解了预处理究竟是在做什么。
(第2章0.5分)
第3章 编译
3.1 编译的概念与作用
概念:
编译驱动程序的工作就是通过分析语言的词法和语法,判断所有的源程序内容是否符合c语言的标准,然后将其翻译成中间代码或是汇编代码,编译器在这一步会将hello.i文件翻译成文本文件hello.s。这个文件中的代码被翻译成汇编代码。
作用:
-
语法分析:
编译器的语法分析器以c源代码作为输入,分析其中的单词符号字符串是否形成符合规范的语法单位。
-
中间代码的生成:
源程序的一种编译内部的表示,被称作中间语言,中间语言存在的意义是是的被编译的程序的结构在逻辑上更加接近与机器指令,在逻辑上更加简单具体,并在这一步对于源程序的编译开始进行优化。对于程序进行各种在程序执行效果上的等价的优化,使得变换后的程序生成更有效率的执行代码。
-
目标代码:
在这里,中间代码被转换成目标代码,这里可以指汇编语言代码,经过汇编之后才可以成为能够执行的机器语言代码。
3.2 在Ubuntu下编译的命令
命令行输入:
Linux> gcc -S hello.i -o hello.s
图3-1
3.3 Hello的编译结果解析
3.3.1 文件头部
伪指令 | 含义 |
---|---|
.file | C文件声明 |
.text | 代码段 |
.section .rodata | 只读数据段 |
.align | 对指令或者数据的存放地址进行对齐的方式 |
.long .string | 声明long型、string型数据 |
.globl | 声明全局变量 |
.type | 指明函数类型或对象类型 |
.size | 声明变量大小 |
图3-2 hello.s头部段
数据
hello.c中有整数、数组