深入理解计算机系统-第三章-程序的机器级表示-3.1-3.3

本文介绍了程序从C源代码到可执行文件的编译过程,包括预处理器、编译器、汇编器和链接器的作用。讨论了处理器的几种关键状态,如程序计数器、整数寄存器、条件码寄存器和浮点寄存器,并解释了虚拟地址和存储器模型。同时,提到了汇编语言的特点和数据格式在IA32架构中的表示。
摘要由CSDN通过智能技术生成

3.2 程序编码

假设我们写一个C程序,有两个文件p1.c和p2.c,我们用unix命令行来编译这段代码
gcc -o2 -o p p1.c p2.c
o2:告诉编译器会使用第二级优化,会使得最终程序运行得更快,但是编译时间会变长,对代码进行调试会变得更加困难
这个命令实际上调用了一系列的程序,将源代码转化为可执行的代码

  1. C预处理器会扩展源代码,插入所有用#include命令指定的文件,并扩展所有的宏。
  2. 编译器会产生两个源代码的汇编代码,名字分别为p1.s和p2.s
  3. 汇编器会将汇编代码转化为二进制目标代码文件p1.o和p2.o
  4. 最后,链接器会将两个目标文件与时间标准unix库函数的代码合并。并产生最终的可执行文件

机器级代码

前面我们就说过,计算机系统使用了多种不同的抽象,利用更简单的抽象模型来隐藏实现的细节。对于机器级编程来说,有两种抽象特别重要:

①、第一种是将机器级程序的格式和行为定义为指令集体系结构(Instruction set architecture ,ISA),它定义了处理器状态、指令的格式,以及每条指令对状态的影响。大多数 ISA,包括 Intel IA32 和 x86-64,将程序的行为描述成好像每条指令是按顺序执行的,即一条指令结束后,下一条指令开始。处理器的硬件远比描述的精细复杂,它们并发的执行许多指令,但是可以采取措施保证整体行为与 ISA 指定的顺序执行完全一致。

②、第二种是机器程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组。存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值