本讲概述

考试:占比不高,不必惊慌


本讲内容

  • 学期总结
  • 如何阅读汇编代码

学期总结

这学期学了什么?

printf() 在计算机软件/硬件系统上,各自发生了什么?


CPU (NEMU) 始终在执行指令

  • (用户代码执行)
  • 库函数 (Navy, ...)
  • 系统调用 wrapper
  • syscall / int $0x80
  • (操作系统代码)
  • 中断/异常处理程序 (AbstractMachine)
  • 系统调用实现

福利:如何阅读汇编代码

期末试题 (2018)

期末真题 dump.txt


一些观察

  • 试卷同时提供 C 和对应的汇编代码
    • 并不严格需要 (可以用来检查你的理解是否准确)
  • 编译不带优化 (默认 -O0)
    • 大量冗余的视觉干扰
  • “7 ± 2 法则”
    • 除非刻意训练,否则人的短时记忆能力非常有限
      • George A. Miller, 1956
  • 抱怨做不完?先花 20 分钟把代码改写一下

阅读代码的建议

“逆向工程”

  • 从汇编代码推导出程序的行为

几点要素

  1. 将不容易理解的符号用容易理解的方式代替
  2. 将一段汇编代码用容易理解的方式表达
  3. 假设内存/寄存器中的数值是变量,人肉模拟调单步调试
    • 每当出现分支时,世界都会复制两份

Happy New Year & 明年见


Take-aways

机器永远是对的

没什么是 RTFM/RTFSC 解决不了的

知道了计算机系统这个 “状态机” 是如何工作的