JGE 为何依赖 SF 与 OF,以及 OF=1 时符号翻转的原理
CMP A, B(本质为 A − B)后,| 情况 | A − B 结果 | SF | OF | SF = OF? | 跳转? |
|---|---|---|---|---|---|
| A > B,无溢出 | 正数 | 0 |
0 |
0 = 0 ✔ | 跳转 |
| A = B,无溢出 | 零 | 0 |
0 |
0 = 0 ✔ | 跳转 |
| A < B,无溢出 | 负数 | 1 |
0 |
1 ≠ 0 ✘ | 不跳 |
| A < B,有溢出 | 符号被翻转 | 0 |
1 |
0 ≠ 1 ✘ | 不跳 |
| A > B,有溢出 | 符号被翻转 | 1 |
1 |
1 = 1 ✔ | 跳转 |
用具体数字说明(8位有符号数,范围 −128 ~ +127):
取 A = 100,B = −50,显然 A > B,JGE 应该跳转。真实结果 100 − (−50) = 150,超出 +127,发生正溢出:
| 溢出方向 | 真实结果 | SF(假象) | OF | 真实符号 = SF XOR OF |
|---|---|---|---|---|
| 正溢出(结果 > +127) | 正数 | 1(错) |
1 |
1 XOR 1 = 0 → 正 ✔ |
| 负溢出(结果 < −128) | 负数 | 0(错) |
1 |
0 XOR 1 = 1 → 负 ✔ |
真实符号 = SF XOR OF
JGE 跳转条件 = 真实结果 ≥ 0 = (SF XOR OF) = 0 = SF = OF
SF 是"加了噪声的符号",OF 就是那个噪声。SF XOR OF 把噪声消掉,还原真实符号。SF=1 且 OF=1,两个 1 异或得 0,说明真实结果是正数,A ≥ B,所以跳转。
| A | B | 实际大小 | CF | CF 的结论 | 正确? |
|---|---|---|---|---|---|
| −1 | 1 | −1 < 1 | 0 |
CF=0 → 误判为 A ≥ B | ❌ 错误 |
| 127 | −1 | 127 > −1 | 1 |
CF=1 → 误判为 A < B | ❌ 错误 |
JGE SF=OFJG SF=OF, ZF=0JLE SF≠OF 或 ZF=1JL SF≠OFJAE CF=0JA CF=0, ZF=0JBE CF=1 或 ZF=1JB CF=1CF 只记录"二进制借位",对有符号数毫无意义,会给出错误结论。
SF + OF 的配合能正确反映有符号运算后的真实正负关系——OF 像一个"纠错位",在发生溢出时翻转判断逻辑,使 SF 的含义始终可信。