
翻出几份大学时的实验报告
最近在硬盘里翻出来一个文件夹,名字叫「计算机原理」。
点开一看,是大学时候那门课的实验报告。.docx 的表格式报告,标题栏写着姓名、班级、学号、指导老师、实验日期——标准得像是昨天才交上去的。
我盯着那几个字段看了挺久。
那些报告里写了什么
其实内容不多。一门专业基础课,几个实验:
- 看编译器怎么把
a * 3优化成移位和加法 - 用 IDA 和 OllyICE 逆一个登录校验,从内存里挖出密码
- 手工构造栈溢出,让一个 exe 打开蜘蛛纸牌
- 算直接映射缓存的命中率,最后算出来是 0%
当时的实验报告,很多地方写的是「在同学的帮助下我明白了」「在请教同学之后我发现」。 现在回头看,那大概是真话——大部分时间确实是卡住的。
为什么想整理
说实话,当时做这些实验,很多是照着步骤跑通的。
IDA 里看到一堆指令,跟着报告一步步点,最后蜘蛛纸牌弹出来了,实验就算完成。
但要是有人问我「为什么是 jmp esp 而不是 jmp eax」,
或者「为什么你的机器码和别人的不一样」——
那会儿的我大概答不上来。
现在重新把报告敲成 Markdown,一行一行写下来,才发现自己当时漏掉了多少东西。
比如栈溢出那个实验,报告里我写「我的 jmp esp 地址和别人的不一样,陷入了巨大的混乱」。 当时是模模糊糊地绕过去了。这次整理的时候才真正想通:
call后面跟的是相对偏移量,不是绝对地址。 所以同一段代码放在不同位置,编译出来的机器码当然不一样。
一句话的事。当时卡了我很久。
顺手做了点处理
搬到站上之前,我把报告里的个人信息都删掉了:
- 姓名、学号、班级
- 指导老师姓名
- 带年级标识的课程资料路径
原始报告里那些截图也没放上来——IDA 和 OllyICE 的窗口标题、文件路径里 很容易带上 Windows 用户名,我没法逐张确认干净,索性只保留文字部分。
至于内容本身,我基本是照实整理的,包括当时写得不太对的地方。
毕竟这是一份「我当时是怎么想的」的记录, 而不是「一份标准答案」。 把它修得完美无缺,反而没什么意思了。
一点感慨
大学那几年,很多课都是这样:上完、考完、就忘了。
当时觉得抽象得要命的东西——补码、大小端、缓存映射——
现在做前端、写部署脚本,居然还真用得上。
至少看到 imul 配 shr 会反应过来「这原本是个除法」。
也可能只是因为,现在终于有耐心把它看懂了。
那会儿赶着交作业,一心想的是「怎么让它跑起来」。 现在没有 deadline 了,反而愿意坐下来,把每一条指令的意思弄清楚。
也算是另一种形式的复习吧。
关于这个系列
我打算陆陆续续把大学时期的课程实验都整理出来。
不图别的,就是想给那几年留个记录。 如果刚好有人在学同样的课、被同样的地方卡住, 能从这里找到一句有用的话,那就更好了。
第一篇已经从「计算机原理」开始了。 后面如果翻出别的课,再慢慢加。
写于一个整理旧文件的下午。