JZ
(Jump if Zero)和 JNZ
(Jump if Not Zero)是两个条件跳转指令,它们根据标志寄存器中的 零标志位(Zero Flag,ZF)的状态来决定程序的跳转行为。两者的区别在于跳转的条件相反。
1. JZ(Jump if Zero)
功能:
- 当 零标志位(ZF) 被设置为1时,
JZ
指令执行跳转。
使用场景:
- 主要用于检查某个操作的结果是否为零。如果操作结果为零(例如两个值相等,或减法结果为零),那么
ZF
被置为1,此时JZ
将会跳转到指定的目标地址。
示例:
代码语言:javascript复制CMP AX, BX ; 比较 AX 和 BX 的值
JZ target ; 如果 AX == BX,ZF 被置1,跳转到 target 标签
在上面的例子中,如果 AX
和 BX
相等,CMP
指令会将 ZF
设置为 1,JZ
指令将跳转到 target
标签。
2. JNZ(Jump if Not Zero)
功能:
- 当 零标志位(ZF) 被设置为0时,
JNZ
指令执行跳转。
使用场景:
- 用于检查某个操作的结果是否不为零。如果操作结果不为零(例如两个值不相等,或减法结果不为零),那么
ZF
被清零,此时JNZ
将会跳转到指定的目标地址。
示例:
代码语言:javascript复制CMP AX, BX ; 比较 AX 和 BX 的值
JNZ target ; 如果 AX != BX,ZF 被清零,跳转到 target 标签
在上面的例子中,如果 AX
和 BX
不相等,CMP
指令会将 ZF
设置为 0,JNZ
指令将跳转到 target
标签。
总结
JZ
(Jump if Zero)会在ZF = 1
时跳转,通常用于检查操作结果是否为零。JNZ
(Jump if Not Zero)会在ZF = 0
时跳转,通常用于检查操作结果是否不为零。
这两个指令通常在需要基于条件执行不同路径的程序中用来实现条件分支。
举两个例子就懂了
示例:检查内存单元首地址2200H起的50个字节与首地址3200H起的50个字节是否相等
代码语言:javascript复制CLD ; 清除方向标志DF,使比较方向为从低地址到高地址
MOV SI, 2200H ; 将源串的起始地址2200H加载到SI
MOV DI, 3200H ; 将目的串的起始地址3200H加载到DI
MOV CX, 50 ; 将比较字节数50加载到CX
REPE CMPSB ; 如果相等且ZF=1,继续比较,直到CX=0或发现不相等
JZ LP1 ; 如果ZF=1,则跳转到标签LP1,表示所有字节都相等
DEC SI ; 如果不相等,将SI指针减1,指向第一个不相等的字节
MOV BX, SI ; 将第一个不相等字节的地址存入BX
MOV AL, [SI] ; 将源串中第一个不相等的字节内容存入AL
JMP LP2 ; 跳转到标签LP2
LP1: MOV BX, 0 ; 如果所有字节相等,则将BX置为0
LP2: ; 继续执行后续代码
示例:在内存附加段(ES
段)4300H地址开始的100个字节中查找字符 *
。如果找到,偏移地址存入BX
寄存器;如果未找到,BX
= 0。
代码语言:javascript复制CLD ; 清除方向标志,设置为向前搜索
MOV DI, 4300H ; 初始化DI为4300H,指向内存中的第一个字节
MOV AL, '*' ; 在AL中加载要查找的字符 '*'
MOV CX, 100 ; 设置搜索范围为100个字节
REPNZ SCASB ; 逐字节比较,直到找到'*' 或 CX=0
JNZ LP1 ; 如果未找到(ZF=0),跳转到LP1
DEC DI ; 减小 DI,因为 SCASB 会多移动一个字节
MOV BX, DI ; 将找到的位置偏移地址存入BX
JMP LP2 ; 跳转到 LP2
LP1:
MOV BX, 0 ; 未找到 '*',将 BX 设为 0
LP2:
; 继续其他代码