程序编码(深入理解计算机系统)

文章目录

  • 机器级代码
  • 代码示例

Linux> gcc -> Og- 0 p p1.c p2.c

  • gcc是linux上默认的编译器
  • 使用较高级别优化产生的代码会变形,-Og优化是我们学习使用的工具。
  • 首先C预处理器扩展源代码,插入所有用#include命令指定的文件,并扩展所有用#define声明指定的
  • 其次编译器产生两个源文件的汇编代码:p1.s,p2.s
  • 然后汇编器将汇编代码转变 为二进制目标代码文件p1.o,p2.o
  • 最后链接器将两个目标文件与实现库函数的 代码 合并,产生 可执行代码文件p

机器级代码

计算机系统使用了多种不同形式的抽象,两种抽象最为重要:
第一种:指令集体系结构或指令集架构(ISA)
第二种:机器级程序使用的内存地址是虚拟地址,提供的 内存模型看上去是一个非常大的字节数组

x86-64的机器代码和原始的c代码差别非常大。一些通常对c语言程序员 隐藏的处理器状态都是可见的

  • 程序计数器(PC)用%rip表示,给出将要执行的下一条指令在内存之中的地址
  • 整数寄存器文件包含16个命名的位置,分别 储存 64位的值,可以储存在地址或整形数据,有的寄存器储存重要的程序状态,有的寄存器储存临时数据。
  • 条形码寄存器保存最近执行的算术或逻辑指令的状态信息。例如if while
  • 一组向量寄存器可以存放一个或多个整数或浮点数值

程序内存包括

  • 程序的可执行机器代码
  • 操作系统需要的一些信息
  • 用来管理过程调用以及返回的栈
  • 以及用户分配的内存块(堆)

代码示例

linux>  gcc -Og -S mstore.c//生成汇编语言
linux> gcc -Og -c mestore.c//生成二进制目标文件mstore.o
linux> gcc -Og -o prox mestore.c//生成可执行文件 
linux>objdump -d prog //反汇编,将目标二进制文件生成汇编文件

在汇编文件之中

  • 以.开头的行都是指导汇编器和链接器工作的伪指令,通常直接忽略

你可能感兴趣的:(csapp,linux)