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;记忆法不能替代正式术语 |
这些结论来自位宽、类型和地址布局推导,并与教材/官方勘误交叉核对。引用仓库是为了补充题型和经验,不代表无条件认可所有笔记内容。
真题驱动的复习闭环#
做题时给每一空标一个错误类别:概念、类型、位宽、端序、地址/值、控制流、边界、计算。错后先写“错误前提是什么”,再找一个最小反例,最后做一题改变位宽或类型的变式。只有重做后能独立推出,才算真正掌握。