深入理解计算机系统学习笔记(三)

三、程序的机器级表示

(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)限制可执行代码区域

 【引入不可执行位】

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值