计算机系统基础——上机作业1

环境搭建

安装vmware虚拟机

安装ubuntu

在Ubuntu终端里编写C语言程序

打开终端:ctrl+alt+t

新建文件:vim hello.c

输入

1
2
3
4
5
6
7
8
#include <stdio.h>
#define DISPLAY "hello c!"
int main(void)
{
printf("%s\n", DISPLAY);
return 0;
}
ZZ(*说明:ZZ当前文件进行快速保存操作*)

退出编译模式:shift+:

输入:w保存q退出

预编译(Preprocessing)

对各种预处理指令(#include #define #ifdef 等#开始的代码行)进行处理,删除注释和多余的空白字符,生成一份新的代码

输入:gcc -E hello.c -o hello.i

  1. 命令分解
  • gcc :GNU Compiler Collection(GCC)的编译器命令。
  • -E :选项表示 仅执行预处理阶段 ,不进行编译、汇编和链接。
  • hello.c :输入的C语言源文件。
  • -o hello.i :指定预处理后的输出文件名为 hello.i.i 是预处理文件的默认后缀)。

2. 预处理阶段的作用

预处理是编译过程的第一个阶段,主要处理以下内容:

  1. 头文件展开
    • #include <stdio.h> 等指令替换为对应头文件的实际内容。
  2. 宏展开
    • 替换 #define PI 3.14 等宏定义。
  3. 条件编译
    • 处理 #ifdef, #ifndef, #endif 等条件编译指令。
  4. 删除注释
    • 移除代码中的注释(///* */)。

编译(Compilation)

对代码进行语法、语义分析和错误判断,生成汇编代码文件

gcc -S hello.i -o hello.s

编译阶段的作用

在编译流程中,-S 选项对应 编译阶段 ,主要完成以下任务:

  1. 语法分析 :检查代码是否符合C语言语法规则。
  2. 中间代码生成 :将预处理后的代码转换为中间表示(如抽象语法树)。
  3. 优化 :根据优化选项(如 -O2)对代码进行优化。
  4. 生成汇编代码 :将优化后的中间代码转换为目标平台的汇编指令(如x86-64汇编)。

汇编(Assembly)

gcc -c hello.s -o hello.o

汇编阶段的作用

该命令执行 汇编阶段 ,将人类可读的汇编代码(如 mov, call 等指令)转换为 二进制机器码 ,生成目标文件(.o)。 目标文件包含:

  • 机器指令(二进制代码)。
  • 符号表(函数名、变量名等)。
  • 未解析的引用(如外部函数 printf 的地址)。

链接(Linking/Build)

gcc hello.o -o hello

链接阶段的作用

链接器(ld)完成以下任务:

  1. 合并代码和数据
    • hello.o 中的机器码与标准库(如 stdio.h 中的 printf)的二进制代码合并。
  2. 解析符号引用
    • 解决外部符号(如 printf)的地址,确保所有函数和全局变量正确关联。
  3. 生成可执行文件格式
    • 创建符合操作系统要求的可执行文件(如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

完成后进行重启,重启过后,点击菜单栏查看,变成重新安装就是成功了。