计算机系统基础——上机作业1
环境搭建
安装vmware虚拟机
安装ubuntu
在Ubuntu终端里编写C语言程序
打开终端:ctrl+alt+t
新建文件:vim hello.c
输入
1 | #include <stdio.h> |
退出编译模式:shift+:
输入:w保存q退出
预编译(Preprocessing)
对各种预处理指令(#include #define #ifdef 等#开始的代码行)进行处理,删除注释和多余的空白字符,生成一份新的代码
输入:gcc -E hello.c -o hello.i
- 命令分解
gcc:GNU Compiler Collection(GCC)的编译器命令。-E:选项表示 仅执行预处理阶段 ,不进行编译、汇编和链接。hello.c:输入的C语言源文件。-o hello.i:指定预处理后的输出文件名为hello.i(.i是预处理文件的默认后缀)。
2. 预处理阶段的作用
预处理是编译过程的第一个阶段,主要处理以下内容:
- 头文件展开
- 将
#include <stdio.h>等指令替换为对应头文件的实际内容。
- 将
- 宏展开
- 替换
#define PI 3.14等宏定义。
- 替换
- 条件编译
- 处理
#ifdef,#ifndef,#endif等条件编译指令。
- 处理
- 删除注释
- 移除代码中的注释(
//或/* */)。
- 移除代码中的注释(
编译(Compilation)
对代码进行语法、语义分析和错误判断,生成汇编代码文件
gcc -S hello.i -o hello.s
编译阶段的作用
在编译流程中,-S 选项对应 编译阶段
,主要完成以下任务:
- 语法分析 :检查代码是否符合C语言语法规则。
- 中间代码生成 :将预处理后的代码转换为中间表示(如抽象语法树)。
- 优化 :根据优化选项(如
-O2)对代码进行优化。 - 生成汇编代码 :将优化后的中间代码转换为目标平台的汇编指令(如x86-64汇编)。
汇编(Assembly)
gcc -c hello.s -o hello.o
汇编阶段的作用
该命令执行 汇编阶段 ,将人类可读的汇编代码(如
mov, call 等指令)转换为
二进制机器码 ,生成目标文件(.o)。
目标文件包含:
- 机器指令(二进制代码)。
- 符号表(函数名、变量名等)。
- 未解析的引用(如外部函数
printf的地址)。
链接(Linking/Build)
gcc hello.o -o hello
链接阶段的作用
链接器(ld)完成以下任务:
- 合并代码和数据
- 将
hello.o中的机器码与标准库(如stdio.h中的printf)的二进制代码合并。
- 将
- 解析符号引用
- 解决外部符号(如
printf)的地址,确保所有函数和全局变量正确关联。
- 解决外部符号(如
- 生成可执行文件格式
- 创建符合操作系统要求的可执行文件(如Linux的ELF格式)。
程序运行
./hello
手动安装VMware tools
手动安装VMware Tools(提示VMware Tools 不再随旧版客户机操作系统的 VMware Workstation 一起提供的解决办法)_哔哩哔哩_bilibili
在线安装
如果方法一不行,可以试试方法二,我是通过方法二进行安装的。
首先更新系统已安装的软件源,以确保是最新的,在终端输入命令:
1 | sudo apt update |
然后再输入命令:
1 | sudo apt install open-vm-tools-desktop |
完成后运行upgrade命令,来升级系统中已安装的软件包(命令后面的 -y可以跳过确认询问):
1 | sudo apt upgrade -y |
完成后进行重启,重启过后,点击菜单栏查看,变成重新安装就是成功了。