在汇编语言中,程序控制流的跳转(也叫条件转移指令)高度依赖于几个标志寄存器位的状态,包括:
- ZF(Zero Flag)
- CF(Carry Flag)
- SF(Sign Flag)
- OF(Overflow Flag)
本文将详细介绍这些标志位的作用,并结合无符号数和有符号数比较,系统梳理各类转移指令。
📌 一、常见标志位介绍
标志位 |
含义 |
设置条件 |
ZF |
Zero Flag |
运算结果为0时置1(常用于判断是否相等) |
CF |
Carry Flag |
无符号数运算产生进位或借位时置1 |
SF |
Sign Flag |
结果为负数时置1(即最高位为1) |
OF |
Overflow Flag |
有符号数运算溢出时置1 |
🧠 二、CMP
指令与标志位的设置
CMP A, B
等价于执行 A - B
,但不保存结果,只更新标志位:
- 用于后续的条件跳转判断。
- 标志位的设置取决于
A - B
的结果。
🔢 三、无符号数判断(依赖 CF 和 ZF)
指令 |
条件 |
说明 |
/ |
|
A > B |
/ |
|
A ≥ B |
/ |
|
A < B |
/ |
`CF=1 | |
/ |
|
A == B |
/ |
|
A ≠ B |
✅ 适用场景:比较地址、长度、索引等非负值。
🧪 示例
asm
CopyEdit
mov al, 5
cmp al, 3 ; 5 > 3 → CF=0, ZF=0
ja label1 ; 满足 CF=0 && ZF=0 → 跳转
mov al, 2
cmp al, 5 ; 2 < 5 → CF=1
jb label2 ; 满足 CF=1 → 跳转
➕ 四、有符号数判断(依赖 SF 与 OF 的关系)
指令 |
条件 |
说明 |
/ |
|
A > B |
/ |
|
A ≥ B |
/ |
|
A < B |
/ |
`ZF=1 |
✅ 适用场景:判断带符号变量,如整数运算、循环退出条件等。
🧪 示例
asm
CopyEdit
mov eax, -5
cmp eax, 3 ; -5 < 3 → SF=1, OF=0 → SF≠OF
jl less_label ; 成立,跳转
mov eax, 3
cmp eax, 3 ; 3 - 3 = 0 → ZF=1, SF=0, OF=0
jle equal_label ; 成立,跳转
📊 五、完整指令对照表
✅ 无符号数转移指令(比较 A 与 B,实质是 A - B)
跳转指令 |
条件(标志位) |
含义 |
/ |
|
相等 |
/ |
|
不相等 |
/ |
|
A > B |
/ |
|
A ≥ B |
/ |
|
A < B |
/ |
`CF = 1 |
✅ 有符号数转移指令(比较 A 与 B)
跳转指令 |
条件(标志位) |
含义 |
/ |
|
A > B |
/ |
|
A ≥ B |
/ |
|
A < B |
/ |
`ZF = 1 |
🔚 六、总结思维导图(文字版)
- 判断是否相等 → 看
ZF
- 无符号判断 → 看
CF
(借位情况) - 有符号判断 → 看
SF
与OF
的关系 SF == OF
→ 无符号错误,说明结果符号可信ZF=1
+CF=0
→ 相等但没借位,可当作“大于等于”
如果你是初学者,建议在调试器中使用 cmp
+ 各类跳转指令组合反复实验,加深理解标志位的真实变化。