Advertisement

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
  • 寄存器分为两种类型:调用者寄存器和被调用者寄存器。

  • 调用者寄存器用于表明被调用函数无法修改其中的数据。

  • 在进行函数调用时,必须将随后需要用到的数值保存到调用者的栈帧中。

  • 当调用函数时,在处理参数时将最开始六个参数被存储于寄存器中,并将后续的部分存储于调用函数所在的栈帧中

  • 参数是自底向上地存储

这里写图片描述

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)

还没有任何评论哟~