CSAPP 第二章 机器级表示
x86处理器的历史;
摩尔定律,每18个月翻一倍;但近年来,半导体产业步入后摩尔时代;
C程序源代码转化成可执行代码过程:
1.C预处理器扩展源代码,插入所有#include命令指定的代码,扩展所有#define声明指定的宏。
gcc -E hello.c -o hello.i
cat hello.i
通过“替换”伪指令:宏定义指令、条件编译指令、头文件包含指令、特殊符号(如LINE,FILE标识符),生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。
- 编译器产生两个源文件的汇编代码,*.s文件。
gcc - S hello.i -o hello.s
cat hello.s
编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析以及优化。
优化阶段:优化处理是编译系统中一项比较艰深的技术。优化过程不仅与编译技术本身有关,还与特定机器的硬件环境也有很大的关系。第一类型的优化,主要的工作是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播,和无用赋值的删除等。第二种类型的优化同机器的硬件结构密切相关,最主要的是考虑如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少内存的访问次数。同时考虑指令并行缩减执行时间,流水线、指令集架构等。
3.汇编器将汇编代码转化成二进制目标代码,*.o文件。
gcc -c hello.c -o hello.o
cat hello.o
目标代码是机器代码的一种形式,它包含所有指令的二进制表示,但是还没有填入地址的全局指。
4.链接器将目标代码文件和实现库函数的代码合并,并产生最终的可执行文件。
两种抽象:指令集架构ISA、虚拟地址空间
分支预测逻辑来猜测每条跳转指令是否会执行,只要它的猜测还比较可靠(现代微处理器设计试图达到90%以上的成功率),指令流水线中就会充满着指令;但是错误预测会招致很严重的惩罚,浪费大约15~30个时钟周期(书中时间),导致程序性能严重下降。
Architecture ISA:instruction set architecture
Microarchitecture:Implementation of the architecture(cache sizes and core frequency eg)
Code Forms:Machine Code\Assembly Code
过程调用时寄存器空间不够后才使用栈帧,并不是所有的都需要栈帧;
GDB调试技巧;
objdump -d bomb > obj.txt
gdb bomb