标志位详解:CF/ZF/SF/OF 如何影响程序流程

标志位是 CPU 的情绪指示器。加法溢出会设置 OF,结果为零会设置 ZF。本文通过代码示例,演示如何利用标志位实现条件跳转、循环控制和错误检测。

FLAGS 寄存器

CPU 执行指令后,会自动更新 FLAGS 中的状态位。这些标志位决定了程序的分支走向

核心标志位

标志全称何时置 1示例
ZFZero结果为 0SUB AX, AX → ZF=1
CFCarry无符号溢出(进位/借位)ADD AL, 0FFh → CF=1
SFSign结果为负(最高位=1)SUB AL, 5 → SF=1
OFOverflow有符号溢出ADD AL, 7Fh, 1 → OF=1

条件跳转指令

跳转指令根据标志位决定走向:

指令含义检查标志
JE/JZ等于/为零ZF=1
JNE/JNZ不等于/非零ZF=0
JC有进位CF=1
JNC无进位CF=0
JG大于(有符号)ZF=0 且 SF=OF
JA大于(无符号)CF=0 且 ZF=0

实战:判断两数大小

1
2
3
4
5
6
7
MOV AX, 100
MOV BX, 200
CMP AX, BX      ; 实际执行 AX - BX

JG  GREATER     ; 如果 AX > BX(有符号)
JL  LESS        ; 如果 AX < BX
JE  EQUAL       ; 如果相等

CF 与 OF 的区别

这是初学者最容易混淆的点:

  • CF 关注无符号数:0FFh + 1 = 100h → 进位了,CF=1
  • OF 关注有符号数:7Fh + 1 = 80h → 从 +127 变成 -128,溢出了,OF=1

总结

标志位是汇编语言的"红绿灯"。掌握它们,你才能写出有逻辑判断的程序。

下一篇:《汇编语言语法与程序格式:段定义、数据声明与伪指令》

广告
广告位预留中 (728x90)