汇编中转移指令与标志位详解:CF、ZF、SF、OF 怎么影响跳转?

在汇编语言中,程序控制流的跳转(也叫条件转移指令)高度依赖于几个标志寄存器位的状态,包括:

  • 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)

指令

条件

说明

JA

/ JNBE

CF=0 && ZF=0

A > B

JAE

/ JNB

CF=0

A ≥ B

JB

/ JC

CF=1

A < B

JBE

/ JNA

`CF=1

JE

/ JZ

ZF=1

A == B

JNE

/ JNZ

ZF=0

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 的关系)

指令

条件

说明

JG

/ JNLE

ZF=0 && SF=OF

A > B

JGE

/ JNL

SF=OF

A ≥ B

JL

/ JNGE

SF≠OF

A < B

JLE

/ JNG

`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)

跳转指令

条件(标志位)

含义

JE

/ JZ

ZF = 1

相等

JNE

/ JNZ

ZF = 0

不相等

JA

/ JNBE

CF = 0 && ZF = 0

A > B

JAE

/ JNB

CF = 0

A ≥ B

JB

/ JC

CF = 1

A < B

JBE

/ JNA

`CF = 1


✅ 有符号数转移指令(比较 A 与 B)

跳转指令

条件(标志位)

含义

JG

/ JNLE

ZF = 0 && SF = OF

A > B

JGE

/ JNL

SF = OF

A ≥ B

JL

/ JNGE

SF ≠ OF

A < B

JLE

/ JNG

`ZF = 1


🔚 六、总结思维导图(文字版)

  • 判断是否相等 → 看 ZF
  • 无符号判断 → 看 CF(借位情况)
  • 有符号判断 → 看 SFOF 的关系
  • SF == OF → 无符号错误,说明结果符号可信
  • ZF=1 + CF=0 → 相等但没借位,可当作“大于等于”

如果你是初学者,建议在调试器中使用 cmp + 各类跳转指令组合反复实验,加深理解标志位的真实变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值