CMU CSAPP笔记 第三章
发布时间
阅读量:
阅读量
machine language(csapp-3.1~3.5)
- 基本操作
- operand src dest
- 地址表示模式

control(csapp-3.6)
- 条件码


testq %rax,%rax能够检测%rax的正负号。- 左边表示控制条件的转移位置, 右边表示数据传输的路径

* 数据条件转移适合于内部计算不复杂的情况,并且可能带来副作用
* 好处:

- while循环编译成汇编时,会变成两种goto形式
第一种:jump to middle

第二种: guarded-do

- for循环也会改成while形式在改成goto形式
- init有时可省去

- switch编译采用跳转表结构
- 无需采用条件判断语句(if-else)
- 跳转所需时间不受开关数量影响
- 其中一种实现方式是通过ja来处理无符号数
这使得对负数的处理更加方便。
将负数值转换为无符号后会得到较大的正数值。

procedure(csapp-3.7)
-
出栈和入栈操作
-
push %reg:将该寄存器中的数值存储到内存偏移 (%rsp - 8) 的位置中 -
pop %reg:从内存偏移位置 (%rsp + 8) 取出数值,并将其赋值给指定寄存器 %reg -
调用指令
-
将call代码下一行的地址A压入栈顶
-
将PC置为被调用函数的基址
- ret指令
- 从栈中弹出地址A
- 将PC设为A
- ret指令
-
寄存器分为两种类型:调用者寄存器和被调用者寄存器。
-
调用者寄存器用于表明被调用函数无法修改其中的数据。
-
在进行函数调用时,必须将随后需要用到的数值保存到调用者的栈帧中。
-
当调用函数时,在处理参数时将最开始六个参数被存储于寄存器中,并将后续的部分存储于调用函数所在的栈帧中
-
参数是自底向上地存储

data(csapp-3.8~3.9)
32位与64位区别
- 内存并非由一个个32位或64位的长方体依次堆叠而成;每个长方体对应一个内存地址;实际上内存更像是延伸成一条长长的带子。
- 访问单位最小为1个字节(即8个bit)。
- 所谓64位和32位分别指的是表示一个内存地址所需的字节数量。
- 因此它们之间的主要区别在于上一章所述的虚拟地址空间大小。
- 对于采用32位机制的操作系统来说,在理论上最多只能支持到4GB(即2^32 / 8 / 1024 / 1024 / 1024 = 4GB)。
- 因此即使你拥有一个容量为8GB的物理内存条也是没有用处的——因为系统无法解析超过4GB的有效地址范围。
二维数组访问

对齐
- 所有K字节的基本对象的地址必须是K的整数倍
- 当编写结构内部的对象时,在声明它们时应遵循从大到小的顺序(这有助于减少总体结构大小)

overflow(csapp-3.10~3.10)
- 一个程序的内存示意图

- 栈溢出

- 抵抗栈溢出攻击的主要方法有三种
- 采用随机化的手段提升坐标的抗侧向特性
- 局部区域信息被屏蔽
- 认证机制具体实现如下:
- 在数据结构中预留一段保护区间
- 一旦发生变动则触发异常检测机制进行响应
全部评论 (0)
还没有任何评论哟~
