程序的机器级表示
本章学习内容:汇编代码
高级语言屏蔽了程序的机器级实现。
用高级语言编写的程序可以在不同的机器上运行,汇编代码则于特定机器密切相关
学习汇编代码能理解编译器优化能力,并分析代码中隐含的低效率
此外,高级语言提供的抽象层会隐藏我们想要了解的程序的运行时行为
此外,很多攻击都涉及到程序存储运行时控制信息的方式的细节
逆向工程:通过研究系统和逆向工作,试图了解系统的创建过程
IA32:x86-64的32位前身(机器可以向后兼容IA32程序)
- C语言、汇编代码以及机器代码之间的关系
- x86-64的细节
- C语言的控制结构的实现
- 过程的实现
- 数组、结构、联合等数据结构的实现
- 内存越界问题
- 系统易遭受缓冲区溢出攻击的问题
- GDB调试器检查机器级程序运行时的行为技巧
历史观点
Intel处理器俗称x86,最开始的时候是单芯片
每个后继处理器都是向后兼容的:较早版本的代码可以在较新的机器上运行
- 摩尔定律
晶体管数量以每年大约37%的速率增加=>每26个月翻倍
摩尔定律:1965年,摩尔预测在未来10年,芯片上的晶体管数量每年都会翻倍。在超过50年的事件里,半导体工业能使得晶体管数目每18个月翻倍
这些年出现了很多与Intel处理器兼容的处理器,例如AMD
经过了数十年的发展,曾经的晦涩难懂的特性已经不再会出现了
数据格式
byte:8位
word:16位
double word:32位
quad word:64位
标准int为双字,64位的指针为四字
x86-64指令集包括对完整的针对字节、字、双字的指令
C | Intel数字精度 | 汇编代码后缀 | 大小(字节) |
---|---|---|---|
char | 字节 | b | 1 |
short | 字 | w | 2 |
int | 双字 | l(long word) | 4 |
long | 四字 | q | 8 |
char * | 四字 | q | 8 |
float | 单精度 | s | 4 |
double | 双精度 | l | 8 |
大多数GCC生成的汇编代码指令带有一个字符的后缀,表明操作数的大小
例如:数据传送指令有四种:
- movb