ICS 与 8086 复习附录:考前速查与易错点
这份附录适合在完成正文后检查遗漏。遇到不能解释的条目,应回到对应篇目重做算例;能背出结论而不能写出位宽和平台前提,仍容易在变式题中出错。
高频计算关系
| 主题 | 计算关系或判定规则 | 对应篇目 |
|---|---|---|
| w 位无符号范围 | 0…2^w-1 |
03 |
| w 位补码范围 | -2^(w-1)…2^(w-1)-1 |
03 |
| 补码真值 | 最高位1时,无符号值-2^w |
03 |
| 8086 段基址 | 段值×10H |
05 |
| 8086 物理地址 | 段值×10H+有效地址,边界按相应环境处理 |
05—06 |
| IA32 比例变址 | 基址+变址×比例+位移 |
11 |
| binary32 规格化值 | (-1)^s×(1+F/2^23)×2^(E-127) |
04 |
| binary32 最小正值 | 非规格化 2^-149;规格化 2^-126 |
04 |
| binary64 最小正值 | 非规格化 2^-1074;规格化 2^-1022 |
04 |
| 一维数组元素地址 | 首地址+i×元素大小 |
14 |
| 二维连续数组地址 | 对 T a[R][C],首址+(i×C+j)×sizeof(T) |
14 |
| 结构体成员对齐 | 按指定 ABI 将当前偏移上取整到成员对齐倍数 | 14 |
| PC 相对重定位 | 按题设重定位类型计算,常见形式 S+A-P |
15 |
公式中的 w 是总位数,F 是小数字段的无符号整数值。算地址时十进制与十六进制应明确标出;重定位的 P、A 等符号也必须以相应 ABI 定义为准。
条件跳转速查
以下针对 CMP A,B 所完成的 A-B;这是 Intel 目的在前的书写顺序。AT&T 通常写源 B 在前、目的 A 在后。
| 关系 | 无符号 | 有符号 |
|---|---|---|
| 等于 | JE,ZF=1 | JE,ZF=1 |
| 不等于 | JNE,ZF=0 | JNE,ZF=0 |
| 大于 | JA,CF=0且ZF=0 | JG,ZF=0且SF=OF |
| 大于等于 | JAE,CF=0 | JGE,SF=OF |
| 小于 | JB,CF=1 | JL,SF≠OF |
| 小于等于 | JBE,CF=1或ZF=1 | JLE,ZF=1或SF≠OF |
CF 与 OF 含义不同;比较之前若有其他指令改写标志,跳转就可能不再反映原 CMP。具体标志定义见正文07、08、12及各篇官方参考。
容易失分的区别
| 容易混淆的两项 | 应怎样区分 |
|---|---|
| 位模式与真值 | 先确定有无符号、位宽、整数或浮点,再解释位串 |
| 进位与溢出 | CF服务无符号进借位,OF服务有符号范围 |
| 机器截断与 C 有符号溢出 | 不能把加法器低位结果当作普通 C 的保证 |
| MOV 与 LEA | MOV取得操作数内容,LEA计算有效地址 |
| OFFSET 与变量名 | 在 MASM 中前者求偏移,类型变量常表示内存操作数 |
| 段值与段基址 | 段基址由段值左移四位得到 |
| 偏移与物理地址 | 8086 先算偏移,再选择段并形成物理地址 |
| ASSUME 与初始化 DS | ASSUME是汇编时声明,初始化需要运行时指令 |
| END 与程序退出 | END结束源文件并可指定入口,不会执行 DOS 退出 |
| 不改标志与标志未定义 | 前者可保留原值,后者不能继续推断 |
| LOOP 与 DEC/JNZ | 循环效果可近似,但标志影响不同 |
| REPE 的第一次与后续比较 | CX非零即可开始第一次;后续根据新ZF决定重复 |
| CX为零与字符串相等 | 最后一个字符也可能失败,要结合ZF和长度 |
| 堆与栈 | heap和stack是不同区域,中文“堆栈”常指stack |
| CALL 与函数序言 | CALL保存返回地址;局部空间和寄存器保存由代码及约定处理 |
| ELF节与装载段 | 链接视图看节,装载映射主要看程序头中的段 |
| COMMON 与弱符号 | 历史合并规则、编译选项与ELF符号绑定应分开 |
原材料中的重点勘误
以下仅列会直接影响做题的项目,来源页码与正文对应。
| 原材料位置 | 正确规则或修正 |
|---|---|
| 汇编第2章第22页 | BX可作8086基址寄存器,不能与AX、CX、DX一并排除 |
| 汇编第2章第39页 | FS、GS属于后续处理器,不属于8086 |
| 汇编第2章第49页 | 16位端口地址有65536个取值,最大地址FFFFH |
| 汇编第3章第20页 | 一般内存操作数地址含BP时默认段为SS |
| 汇编第3章第42页 | 该例物理地址求和应为31220H |
| 汇编第3章第98页 | 非零移位计数时,CF保存最后移出的位;计数为零则保留原标志 |
| 汇编第3章第113—114页 | LODS只取源串;REPE/REPNE首次操作不先检查旧ZF |
| ICS数据表示第98页 | 双精度最小正非规格化数为2^-1074 |
| ICS数据表示第188页 | 0.1的误差题须区分截断与默认就近偶数舍入 |
| ICS指令系统第68页 | stack与heap分开,“堆栈”不表示由两者组成 |
| ICS指令系统第83页 | 16位DX/AX操作应使用匹配宽度;移两位后的OF未定义 |
| DEBUG文档第16页 | O为写端口,示例的命令字母不应写成I |
最后一遍复习的检查顺序
先独立完成每篇三道自测,再检查错误属于哪一类:概念混淆、进制换算、地址计算、位宽遗漏、标志选错、边界未处理或平台假设错误。按错误类别重做相应算例,通常比从第一页重新背课件更有针对性。
程序题应先保证条件与边界正确,再检查寄存器分工,最后检查语法和运行环境。对于源代码输出题,先排除未定义行为,再讨论给定平台上可确定的结果。对于链接题,先列符号和所属文件,再算重定位;对于栈帧题,先画压栈顺序,再标地址。
讨论这篇文章
关于《ICS 与 8086 复习附录:考前速查与易错点》的补充、不同意见或延伸话题,都可以留在这里。
滚动到这里时自动载入留言。