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有时可省去
- init有时可省去
- switch编译时会使用jump table结构
- 无须使用if-else结构
- 跳转所花费时间与开关数量无关
* procedure(csapp-3.7)*
- call指令
- 把call代码下一行的地址A压如栈中
- 将PC设为被调用函数的起始位置
- ret指令
- 从栈中弹出地址A
- 将PC设为A
- 调用函数时参数的前六个保存在寄存器中,后边的保存在调用函数的栈帧中
- 参数从底下往上保存
- 参数从底下往上保存
data(csapp-3.8~3.9)
二维数组访问
对齐
- 任何K字节的基本对象的地址必须为K的倍数
- 在写结构内部的对象时,应该依照从大到小的顺序声明,这样可以减少结构大小
overflow(csapp-3.10~3.11)
- 防止栈溢出攻击的三种方法
- 随机化栈的坐标
- 部分区域不可读
- 设置一段防护区域,如果被改变,则报告栈溢出