je 是一个在 x86/x64 架构中使用的汇编语言指令,它的全称是 "Jump if Equal"(如果相等则跳转)。

它是一个条件跳转指令,用于根据两个值的比较结果来决定程序是否跳转到指定的代码位置。
核心功能:je 是如何工作的?
je 指令本身并不进行比较操作,它检查的是前一条指令设置在 CPU 的 EFLAGS 寄存器中的“零标志位”(Zero Flag, ZF)的状态。
工作流程如下:
- 执行比较指令:通常在
je指令之前,会有一条比较指令,最常见的是CMP(Compare)。CMP destination, source指令会执行destination - source的计算,但不保存结果,只根据计算结果来设置 EFLAGS 寄存器中的各个标志位。
- 检查零标志位:
destination - source的计算结果等于 0,CPU 会将 ZF 标志位置 1。- 如果计算结果不等于 0,CPU 会将 ZF 标志位置 0。
- 执行跳转:
je指令会检查 ZF 的值。- ZF = 1 (表示相等),
je就会跳转到它指定的目标地址(标签)。 - ZF = 0 (表示不相等),
je不会跳转,程序会继续执行下一条指令。
一个简单的比喻:
想象一个裁判(CMP 比较两个运动员的成绩),他举起一个“相等”的牌子(设置 ZF=1),然后教练(je 指令)看到牌子举起后,才决定是否让运动员去休息区(跳转到目标代码)。

语法
je 的语法非常简单:
je target_label
je是指令助记符。target_label是一个代码标签,如果条件满足,程序就会跳转到这个标签所在的位置执行。
代码示例
这是一个在 C 语言中很常见的逻辑,用汇编语言实现:
C 语言逻辑:
if (a == b) {
// a 和 b 相等,执行这里的代码
do_something();
}
对应的汇编代码 (x86 NASM 语法):

section .text
global _start
_start:
; 假设变量 a 和 b 的值已经分别存放在 EAX 和 EBX 寄存器中
mov eax, 10 ; 将 a 的值 10 放入 EAX
mov ebx, 10 ; 将 b 的值 10 放入 EBX
; --- 关键部分 ---
cmp eax, ebx ; 比较 EAX 和 EBX 的值 (执行 10 - 10)
; 因为结果为 0,ZF 标志位被设置为 1
je equal ; 检查 ZF,因为 ZF=1,所以跳转到 equal 标签
; 如果不相等,会执行这里的代码
jmp end_if ; 直接跳过 "if" 块,跳转到 end_if
equal:
; 如果相等,会执行这里的代码
; (调用一个函数 do_something)
; ... do_something 的代码 ...
end_if:
; 程序继续执行...
; 为了演示,我们让程序退出
mov eax, 1 ; sys_exit 系统调用号
xor ebx, ebx ; 退出码 0
int 0x80 ; 调用内核
另一个例子:je 不成立的情况
mov eax, 10 ; a = 10
mov ebx, 20 ; b = 20
cmp eax, ebx ; 比较 EAX 和 EBX (执行 10 - 20)
; 结果不为 0,ZF 标志位被设置为 0
je equal ; 检查 ZF,因为 ZF=0,*不跳转**,继续执行下一条指令
; 因为 je 不成立,所以会直接执行这里的代码
jmp end_if ; 跳转到 end_if
equal:
; 这里的代码将被跳过
; ...
end_if:
; ...
与 jz 的关系
在 x86 汇编中,je 有一个完全等价的指令:jz (Jump if Zero)。
je:Jump if Equal (如果相等则跳转)jz:Jump if Zero (如果结果为零则跳转)
因为 CMP 指令是通过判断结果是否为 0 来设置 ZF 的,相等”和“结果为零”在逻辑上是完全一样的。je 和 jz 的功能完全相同,可以互换使用,大多数程序员会根据代码的上下文选择更具可读性的那个,在比较两个值是否相等时,je 的意图更清晰。
与其他条件跳转指令的对比
je 是条件跳转指令家族的一员,这个家族都依赖于 EFLAGS 寄存器。
| 指令 | 全称 | 跳转条件 (检查的标志位) | 对应 C 运算符 |
|---|---|---|---|
je / jz |
Jump if Equal / Jump if Zero | ZF = 1 | |
jne / jnz |
Jump if Not Equal / Jump if Not Zero | ZF = 0 | |
jg / jnle |
Jump if Greater / Jump if Not Less or Equal | (SF == OF) 且 ZF = 0 | > (有符号) |
jge / jnl |
Jump if Greater or Equal / Jump if Not Less | SF == OF | >= (有符号) |
jl / jnge |
Jump if Less / Jump if Not Greater or Equal | SF != OF | < (有符号) |
jle / jng |
Jump if Less or Equal / Jump if Not Greater | (SF != OF) 或 ZF = 1 | <= (有符号) |
ja / jnbe |
Jump if Above / Jump if Not Below or Equal | CF = 0 且 ZF = 0 | > (无符号) |
jae / jnb |
Jump if Above or Equal / Jump if Not Below | CF = 0 | >= (无符号) |
jb / jnae |
Jump if Below / Jump if Not Above or Equal | CF = 1 | < (无符号) |
jbe / jna |
Jump if Below or Equal / Jump if Not Above | CF = 1 或 ZF = 1 | <= (无符号) |
je是一个条件跳转指令,全称 "Jump if Equal"。- 它必须紧跟在
CMP或其他会设置 EFLAGS 寄存器的指令(如TEST,SUB)之后。 - 它通过检查零标志位 是否为 1 来决定是否跳转。
je和jz是等价的。- 它是实现
if (a == b)或if (a != b)(配合jne) 等条件逻辑的核心指令,是所有高级语言控制流的基础。
