12 · 往年题导航与勘误
来源为用户指定的 公开仓库。本章原创概括题型与解题路径,不转载整卷。2025 第一次阶段测验与当前第 1~8 讲范围最接近,应当优先于旧式期中卷。
本次核对程度#
已下载 2012~2024 共 13 份带答案期中卷、2024 勘误、2025 两份阶段卷及期中复习细节。细读了 2025 第一次阶段卷的所有题目、2024 期中及勘误的主要题组、2022/2023 的浮点与机器代码相关题组;更早试卷用于逐页题型索引,不声称已逐题独立验算全部历史答案。2014 部分文本提取乱码,页码定位可以使用,但未据乱码推断精确公式。
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 | 递归字符串变换、栈与跳转位移 | 逐条恢复语义,按每层有效字符串长度计递归深度 |
| 2024 第四大题 pp.18~21 | PIPE 前递扩展 | 区分写入数据依赖与地址基址依赖 |
| 2024 第五大题 pp.22~23 | 相联度扩容、LRU、特殊不缓存规则 | 参数变化与逐次状态机模拟 |
| 2023 第二大题 pp.13~15 | E5M2/E4M3、量化、运算次序 | 特殊值规则可被题目修改,不能套统一 FP8 |
| 2023 第三大题 pp.16~18 | 组合数递归与汇编填空 | 参数保留、双递归与活跃栈深度 |
| 2023 第四大题 pp.19~21 | 间接条件跳转、新指令、访存延迟 | 按结果可用阶段重新设计控制 |
| 2022 第二大题 p.10 | 1/3/4 格式、数量、反推格式 | 计算间距与范围,而非只背 FP32 |
| 2022 第三大题 pp.11~13 | switch+结构体+链式间接寻址 | 表项、fall-through、字段偏移共同还原 |
| 2022 第四大题 pp.14~17 | 条件 pop 与流水线 | 条件失败时副作用、rsp 写回、冒险 |
| 2022 第五大题 pp.18~20 | 局部性与 cache | 明确写分配与替换更新 |
2012~2021 题型索引#
以下是对已提取文本的主题定位,属于选题导航,不是每题答案校验报告。
| 年份 | 值得挑选的题组(PDF 页) | 注意 |
|---|---|---|
| 2012 | 浮点 pp.4~5;排序/递归栈 pp.6~10;cache pp.11~12;链接 p.13 | 历史范围含链接,别推定本次也考 |
| 2013 | 表达式 p.5;机器代码 pp.6~9;流水线 p.10;新指令 p.11;cache p.13 | 有 32 位 Y86 语境 |
| 2014 | 数据表示 p.9;机器级/栈 pp.10~13;流水线 pp.14~17;cache p.18 | 部分 OCR 乱码,需直接看原页 |
| 2015 | 数据表示 pp.9~10;汇编/布局 pp.11~14;处理器 pp.15~18;cache pp.19~20 | 注意 IA-32 字长 |
| 2016 | 浮点/表达式 pp.6~8;机器代码 pp.9~11;PIPE pp.12~14;cache pp.15~16 | 延迟口径可能按题目另设 |
| 2017 | 数据表示 p.7;汇编 pp.8~9;处理器 pp.10~12;cache p.13 | 条件访存改变可用阶段 |
| 2018 | 位操作 pp.9~11;机器代码 pp.12~14;流水线 pp.15~17;cache pp.18~19;性能 pp.20~21 | 普通 char 的符号性要看假设 |
| 2019 | 整数/浮点 pp.8~9;机器代码与哨兵 pp.10~15;PIPE pp.16~18;victim cache pp.19~20;memory mountain pp.21~22 | 图题要看原图 |
| 2020 | 数据表示 pp.6~7;机器代码与栈 pp.8~11;leave/enter 新指令 pp.12~13;cache pp.14~16 | 失效时间是否包含命中探测有歧义 |
| 2021 | 数据表示 pp.11~12;递归栈 pp.13~16;处理器 pp.16~20;cache pp.21~23;优化 pp.24~26 | 周期数从 F 到 ret 完成,题设非常关键 |
全部原卷入口:期中目录。更早试卷不能用“同名题型”掩盖平台和标准差异。
应当明确区分的答案问题#
2025 第 3 题:“首字节”的歧义#
short -12 扩为 32 位 int 的位模式为 FFFFFFF4;小端内存从低到高为 F4 FF FF FF。原答案写 FF,只能与“最高有效字节”的解释一致。若按 show_bytes 从最低地址开始打印,第一个字节应为 F4。本手册保留这一判断依据,不把参考答案当作没有歧义的权威结论。
2024:建议处理与最终评分不是一回事#
2024 勘误文件 先列“建议”,最后另有“最终评分方式修改”。最终明确选择第 7 题 A/C、第 9 题 B/C 均算对;选择第 2 题以及 cache 第五题并没有按前文建议普遍改评分。阅读时应以最后的最终处理为准。
第 7 题的核心是结构体返回地址:调用时隐藏缓冲区指针可在 rdi,返回时在 rax;未交代时机就有歧义。第 9 题“转发次数”按通路事件还是按使用次数计数不明确,应写出口径。
cache 的特殊规则称“不缓存包含 10 倍数的块”,但示例答案仍缓存含地址 0 的块。数学上 0 也是 10 的倍数;按给定答案可推测意图是正的倍数。遇到此类自然语言规则应主动说明是否包含 0,而非把隐含约定当成通用规则。
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 有符号取负溢出 |
| 复杂声明可以靠数星号理解 | 必须从变量名按括号和 []/() 优先级解析 |
| 缓存容量 C=S×B | 一般 C=S×E×B,仅 E=1 时可省 E |
| S、B、t 都必须为 2 的幂 | 通常 S、B 为 2 的幂;E 可非 2 的幂;t 是 tag 位数 |
| mov 的源/目的顺序可混写 | AT&T 源在前、目的在后 |
| movs 的 s 是 symbol | s 指 sign,符号扩展 |
| l 后缀是 linguist | l 指 longword;记忆法不能替代正式术语 |
这些结论来自位宽、类型和地址布局推导,并与教材/官方勘误交叉核对。引用仓库是为了补充题型和经验,不代表无条件认可所有笔记内容。
真题驱动的复习闭环#
做题时给每一空标一个错误类别:概念、类型、位宽、端序、地址/值、控制流、边界、计算。错后先写“错误前提是什么”,再找一个最小反例,最后做一题改变位宽或类型的变式。只有重做后能独立推出,才算真正掌握。