ZJZJ / ICS NOTES
学习空间整本阅读
COMPUTER SYSTEMS · PEKING UNIVERSITY

09 · 往年题导航与勘误

来源为用户指定的 公开仓库。本章原创概括题型与解题路径,不转载整卷。2025 第一次阶段测验与当前第 1~8 讲范围最接近,应当优先于旧式期中卷。

本章范围#

以 2025 第一次阶段测验为主;历史题仅选数据表示和机器级程序相关内容。处理器设计、流水线、程序优化、缓存及链接题不纳入本手册。

2025 第一次阶段测验:逐题回查#

试卷与答案

题号 / PDF 页 考察点 复习位置 作答检查
1 / p.2 进制、按位与、逻辑非 02 值与编码解释要分开
2 / p.2 signed/unsigned 常量比较 02 先做通常算术转换
3 / p.2 short 扩展成 int 的字节 02、下方勘误 最高有效字节与最低地址字节不同
4 / p.2 ∞ 编码、float 字段解码 03 e、E、M 不混淆
5 / p.2 二进制最近偶数舍入 03 恰好一半才看保留最低位
6 / pp.2~3 整数转浮点、表达式恒等性 03 结合具体输入范围判断
7 / p.3 寄存器别名 04 32 位名与低字节名
8 / p.3 寄存器和数据内存访问计数 04 是否排除取指,地址寄存器也算访问
9 / p.3 比例寻址 04 先算地址,不读取内存值
10 / p.3 cmp/sub,test/and 05 是否保存运算结果
11 / p.4 setcc、零扩展、32 位写入 04、05 movzbl 的显式与隐含效果
12 / pp.4~5 分支与条件传送 05 按代码语义判断,别被函数名误导
13 / p.5 移位掩码循环 05 还原四要素并检查 n 的边界
14 / p.5 跳转表 05 索引从 0 起,每项跨度
15 / p.6 pop 操作次序 06 旧栈顶读取与 rsp 增量
16 / p.6 call/ret、参数与 rbx 保存 06 返回地址是 call 的下一条
17 / pp.6~7 局部变量寄存器/内存 06 取地址和题设“不高级优化”
18 / p.7 固定二维数组寻址 07 行跨度与元素宽度
19 / pp.7~8 VLA 传参 07 n 参与运行时乘法
20 / p.8 线性地址与二维数组 07 逐项定位元素再求和
21 / pp.8~9 结构体偏移反求维度 07 用对齐不等式联立求解
22 / p.9 混合参数、浮点转换 07 指针走通用寄存器,float 值走 XMM
23 / p.10 union 与大端 08 共享位串,不是转换数值
24 / p.10 缓冲区防护机制 08 源码、编译、OS 与硬件支持分开

从这份卷的覆盖看,不应只复习汇编填空:低字节寄存器、访问计数、零扩展的隐含效果、混合浮点 ABI 等边角知识都直接成为独立小问。各章已据此补齐。

范围内的补充例题#

年份与位置 主题 应学的方法
2024 第二大题 pp.10~12 内存字节→float、自定义 FP8、union 先还原端序,再分字段;数值转换与位重解释分开
2024 第三大题 pp.13~17 递归字符串变换、栈与跳转位移 逐条恢复语义,按每层有效字符串长度计递归深度
2023 第二大题 pp.13~15 E5M2/E4M3、量化、运算次序 特殊值规则可被题目修改,不能套统一 FP8
2023 第三大题 pp.16~18 组合数递归与汇编填空 参数保留、双递归与活跃栈深度
2022 第二大题 p.10 1/3/4 格式、数量、反推格式 计算间距与范围,而非只背 FP32
2022 第三大题 pp.11~13 switch+结构体+链式间接寻址 表项、fall-through、字段偏移共同还原

应当明确区分的答案问题#

2025 第 3 题:“首字节”的歧义#

short -12 扩为 32 位 int 的位模式为 FFFFFFF4;小端内存从低到高为 F4 FF FF FF。原答案写 FF,只能与“最高有效字节”的解释一致。若按 show_bytes 从最低地址开始打印,第一个字节应为 F4。本手册保留这一判断依据,不把参考答案当作没有歧义的权威结论。

2024:结构体返回值的时机#

2024 勘误文件 中选择第 7 题最终允许 A/C 两种答案。核心是结构体返回地址:调用时隐藏缓冲区指针可在 rdi,返回时在 rax;未交代时机就有歧义。答题时要区分“传入结果缓冲区”和“函数返回”。

2022 自定义浮点:“不溢出域内无舍入”与边界舍入#

1/3/4 格式最大有限值为 15.5,可精确表示整数 0~15;原题把 unsigned char 转换概括为“会溢出,不会舍入”。这里可理解为考察可表示范围内的整数均可精确编码;从完整 IEEE 转换过程看边界值仍需进行舍入并可能引发溢出,不宜把它泛化为所有转换都无需舍入逻辑。

同年 switch 题部分路径没有初始化 val 就写结构体,适合按给定汇编还原,不适合作为没有未定义行为的 C 编程范例。本手册的原理解释不依赖这些路径具有可移植结果。

参考笔记中需要纠正的说法#

容易误记的表述 本手册采用的准确版本
sizeof(int*) 是 int 的大小 sizeof(p) 是指针大小;sizeof(*p) 才是所指类型大小
数组名就是指针 数组是对象,很多表达式中发生退化;sizeof/& 等有例外
TMin 不满足位级 ~x+1 取负 模 2ʷ 恒等式仍成立;数学正值不可表示,C 有符号取负溢出
复杂声明可以靠数星号理解 必须从变量名按括号和 []/() 优先级解析
mov 的源/目的顺序可混写 AT&T 源在前、目的在后
movs 的 s 是 symbol s 指 sign,符号扩展
l 后缀是 linguist l 指 longword;记忆法不能替代正式术语

这些结论来自位宽、类型和地址布局推导,并与教材/官方勘误交叉核对。引用仓库是为了补充题型和经验,不代表无条件认可所有笔记内容。

真题驱动的复习闭环#

做题时给每一空标一个错误类别:概念、类型、位宽、端序、地址/值、控制流、边界、计算。错后先写“错误前提是什么”,再找一个最小反例,最后做一题改变位宽或类型的变式。只有重做后能独立推出,才算真正掌握。