第03章 程序的机器级表示

Posted by allon li on 2017-02-22

第03章 程序的机器级表示

Tags: 深入理解计算机系统

[TOC]


程序编码

汇编或者机器码能操作很多对C语言隐藏的CPU状态:

  • 程序计数器(PC,在x86-64中用%rip表示)给出将要执行的下一条指令。
  • 整数寄存器文件的16个位置
  • 条件寄存器(实现if、while等)
  • 一组向量寄存器可以存放一个或多个浮点数值。

汇编指令或者机器码特点:

  • x86-64的指令1到15字节,常用的短,不常用的长。
  • mac上反汇编可以使用otool -tV test.o,linux上可以用objdump
  • 汇编格式分两种:ATT是GCC和objdump默认格式,另外还有intel和微软的使用的都是intel的格式。编译的时候加上-masm=intel。
  • C语言和汇编可以结合编译。另外,C语言的if代价很高。

image_1bf6nhuvqllm13ro1kuo115m13sm.png-150.4kB

类型的关键就在汇编指令的后缀决定着汇编指令的大小和类型,这种约定决定了它是float还是int。
|C声明 | Intel数据类型 | 汇编代码后缀 | 大小(字节) |
| ----------| --------| ----------| --------|
| char | 字节| b |1|
| short | 字 | w |2|
| int | 双字 | l |4|
|long | 四字 |q |8|
|char* |四字| q |8|
|float |单精度| s |4|
|double |双精度| l |8|

控制

###条件码
除了整数寄存器,CPU还维护着一组单个位的条件码(condition code)寄存器。