JCC 指令是一组根据标志寄存器的状态进行条件跳转的指令集合。这些指令通过检查标志位的值来决定是否执行跳转。
一、基于相等/不相等的跳转指令
-
JE/JZ(Jump if Equal/Jump if Zero)
- 当
ZF = 1
时跳转 - 常用场景:判断两个值是否相等
cmp eax, ebx ; 比较 eax 和 ebx je label ; 如果相等,跳转到 label
- 当
-
JNE/JNZ(Jump if Not Equal/Jump if Not Zero)
- 当
ZF = 0
时跳转 - 常用场景:判断两个值是否不相等
cmp eax, ebx ; 比较 eax 和 ebx jne label ; 如果不相等,跳转到 label
- 当
二、基于大小比较的跳转指令(无符号数)
-
JB/JNAE(Jump if Below/Jump if Not Above or Equal)
- 当
CF = 1
时跳转 - 常用场景:无符号数比较,判断是否小于
cmp eax, ebx ; 比较 eax 和 ebx jb label ; 如果 eax < ebx,跳转到 label
- 当
-
JBE/JNA(Jump if Below or Equal/Jump if Not Above)
- 当
CF = 1
或ZF = 1
时跳转 - 常用场景:无符号数比较,判断是否小于等于
cmp eax, ebx ; 比较 eax 和 ebx jbe label ; 如果 eax <= ebx,跳转到 label
- 当
-
JA/JNBE(Jump if Above/Jump if Not Below or Equal)
- 当
CF = 0
且ZF = 0
时跳转 - 常用场景:无符号数比较,判断是否大于
cmp eax, ebx ; 比较 eax 和 ebx ja label ; 如果 eax > ebx,跳转到 label
- 当
-
JAE/JNB(Jump if Above or Equal/Jump if Not Below)
- 当
CF = 0
时跳转 - 常用场景:无符号数比较,判断是否大于等于
cmp eax, ebx ; 比较 eax 和 ebx jae label ; 如果 eax >= ebx,跳转到 label
- 当
三、基于大小比较的跳转指令(有符号数)
-
JL/JNGE(Jump if Less/Jump if Not Greater or Equal)
- 当
SF ≠ OF
时跳转 - 常用场景:有符号数比较,判断是否小于
cmp eax, ebx ; 比较 eax 和 ebx jl label ; 如果 eax < ebx,跳转到 label
- 当
-
JLE/JNG(Jump if Less or Equal/Jump if Not Greater)
- 当
ZF = 1
或SF ≠ OF
时跳转 - 常用场景:有符号数比较,判断是否小于等于
cmp eax, ebx ; 比较 eax 和 ebx jle label ; 如果 eax <= ebx,跳转到 label
- 当
-
JG/JNLE(Jump if Greater/Jump if Not Less or Equal)
- 当
ZF = 0
且SF = OF
时跳转 - 常用场景:有符号数比较,判断是否大于
cmp eax, ebx ; 比较 eax 和 ebx jg label ; 如果 eax > ebx,跳转到 label
- 当
-
JGE/JNL(Jump if Greater or Equal/Jump if Not Less)
- 当
SF = OF
时跳转 - 常用场景:有符号数比较,判断是否大于等于
cmp eax, ebx ; 比较 eax 和 ebx jge label ; 如果 eax >= ebx,跳转到 label
- 当
四、其他常用条件跳转指令
-
JC(Jump if Carry)
- 当
CF = 1
时跳转 - 常用场景:检查是否发生进位
add eax, ebx ; 加法运算 jc label ; 如果有进位,跳转到 label
- 当
-
JNC(Jump if Not Carry)
- 当
CF = 0
时跳转 - 常用场景:检查是否没有发生进位
add eax, ebx ; 加法运算 jnc label ; 如果没有进位,跳转到 label
- 当
-
JO(Jump if Overflow)
- 当
OF = 1
时跳转 - 常用场景:检查是否发生溢出
add eax, ebx ; 加法运算 jo label ; 如果发生溢出,跳转到 label
- 当
-
JNO(Jump if Not Overflow)
- 当
OF = 0
时跳转 - 常用场景:检查是否没有发生溢出
add eax, ebx ; 加法运算 jno label ; 如果没有溢出,跳转到 label
- 当
实际应用示例
; 循环示例:计数从10递减到0
mov ecx, 10 ; 初始化计数器
loop_start:
; 循环体
dec ecx ; 计数器减1
cmp ecx, 0 ; 比较计数器与0
jg loop_start ; 如果计数器>0,继续循环
; 条件判断示例
cmp eax, 100 ; 比较 eax 与 100
jge greater_equal ; 如果 eax >= 100,跳转
jl less_than ; 如果 eax < 100,跳转
小结
- JCC指令是汇编语言中实现程序控制流程的重要工具
- 它们基于标志寄存器的状态进行跳转
- 分为无符号比较和有符号比较两大类
- 使用时需要注意选择正确的跳转指令,特别是在处理有符号数和无符号数时