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

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

2

FLAGS 寄存器

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

核心标志位

标志 全称 何时置 1 示例
ZF Zero 结果为 0 SUB AX, AX → ZF=1
CF Carry 无符号溢出(进位/借位) ADD AL, 0FFh → CF=1
SF Sign 结果为负(最高位=1) SUB AL, 5 → SF=1
OF Overflow 有符号溢出 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)