SF/OF(JG/JL),无符号比较看 CF(JA/JB);switch 在 case 连续密集时用跳转表做到 $O(1)$。| 项目 | 值 |
|---|---|
| 对应高级语言 | if-else、switch-case |
| 机器级实现 | 条件码 + 条件跳转指令(条件分支) |
| 关键标志位 | CF(进位)、ZF(零)、SF(符号)、OF(溢出) |
| 核心指令 | CMP/TEST + 条件跳转指令(Jcc) |
高级语言中的选择结构(if-else、switch)在机器级通过条件码寄存器 + 条件跳转指令实现。
CMP),该指令做减法但不保存结果,只设置条件码 / 标志位 CMP R1, R2 ; 比较,设置条件码
Jcc L1 ; 条件不满足则跳到 else 分支
; then 分支代码
JMP L2 ; 跳过 else 分支
L1: ; else 分支代码
L2: ; 后续代码
if-else 链,逐个比较。| 标志位 | 名称 | 含义 | 设置条件 |
|---|---|---|---|
| CF | 进位标志 | 无符号运算是否产生进位/借位 | 加法产生进位或减法产生借位时 $CF=1$ |
| ZF | 零标志 | 结果是否为零 | 运算结果为 0 时 $ZF=1$ |
| SF | 符号标志 | 结果的符号(最高位) | 结果为负数时 $SF=1$ |
| OF | 溢出标志 | 有符号运算是否溢出 | 有符号数溢出时 $OF=1$ |
| 条件跳转指令 | 含义 | 条件 |
|---|---|---|
| JE / JZ | 相等 / 为零跳转 | $ZF=1$ |
| JNE / JNZ | 不相等 / 非零跳转 | $ZF=0$ |
| JG / JNLE | 大于(有符号) | $ZF=0$ 且 $SF=OF$ |
| JL / JNGE | 小于(有符号) | $SF \neq OF$ |
| JA / JNBE | 大于(无符号) | $CF=0$ 且 $ZF=0$ |
| JB / JNAE | 小于(无符号) | $CF=1$ |
| 考法 | 解题套路 |
|---|---|
| 给定 C 代码写出汇编 | CMP 比较 → 条件跳转 → 分支代码 |
| 根据条件码判断跳转 | 执行 CMP 后分析 ZF/SF/OF/CF 的值 |
| switch 的跳转表实现 | 理解跳转表的索引方式:地址 = 表基址 + (case 值 $- min) \times$ 表项大小 |
| 有符号 vs 无符号比较 | 有符号用 SF/OF 判断(JG/JL),无符号用 CF 判断(JA/JB) |
CMP A, B 计算 $A-B$ 并设置标志位,但不保存结果。if-else 链。if-else 中 then 分支结束后需要 JMP 跳过 else 分支。switch 的跳转表实现效率为 $O(1)$,前提是 case 值连续。↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。