三、程序的机器级表示
(1)Inter处理器的发展历史
(2)调用者保存寄存器
【caller:调用者 callee:被调用者】
(3)被调用者保存寄存器
(4)不同寄存器的保存方式
(5)C语言的基本类型对应的汇编后缀表示
(6)C语言与汇编对应举例
(7)转化
1. 汇编器将汇编代码翻译成二进制的机器代码
2. 反汇编器将机器代码转化为汇编代码(objdump)
(8)寄存器
【不同寄存器扮演着不同的角色】
【新增的八个寄存器】
(9)指令
(10)内存引用
(11)mov指令
【特殊情况】
movq源操作数的立即数只能是32位补码,进行符号位扩展后变成64位在传到目的操作数
movabsq源操作数的立即数可以是64位,但是目的操作数只能是寄存器
【当movl的目的操作数是寄存器时,他会把该寄存器的高4字节设置为0】
【零扩展】
【符号扩展】
(12)栈
push指令只需一个字节
sub+movq指令需八个字节
(13)leaq
【加载有效地址】
【通过leaq实现算数运算】
注意比例因子的取值
(14)一元操作
(15)二元操作
(16)移位操作
(19)移位量
【存储与特定寄存器%cl】
(20)特殊的算术指令
(21)算术指令的运行过程
(22)条件码
(23)cmp指令
【和sub指令类似,但是只会设置条件码,不会改变目的寄存器的值】
(24)test指令
【和and指令类似,但是只会设置条件码,不会改变目的寄存器的值】
(25)set指令
【有符号数】
【无符号数】
【举例】
(26)jump指令
(27)条件传送指令
【基于条件传送的代码比基于跳转指令的代码效率高】
(28)switch
【通过跳转表访问不同分支】
【执行switch使用的时间与case的数量无关,在处理多重分支时,switch会比if-else的效率高】
(29)过程的机制
(30)栈帧
【返回地址的压栈操作并不是由push指令完成的,而是由函数调用指令call来实现的】
【举例】
调用(改变PC,将返回地址压入栈中)
返回(弹出指令并放入%rip中)
(31)参数传递
【参数1 - 6对应的寄存器】
【举例】
(32)数组 --- 基本原则
(33)指针运算
(34)嵌套数组
(35)结构体
(36)结构体数据对齐
【指针变量占八个字节】
【举例】
(37)联合体 unions
(38)缓冲区溢出
(39)对抗缓冲区溢出攻击
(40)栈随机化
(41)栈破坏检测
(41)限制可执行代码区域
【引入不可执行位】