【微机原理】指令JZ和JNZ的区别

🌟 嗨,我是命运之光

🌍 2024,每日百字,记录时光,感谢有你一路同行。

🚀 携手启航,探索未知,激发潜能,每一步都意义非凡。


JZ(Jump if Zero)和 JNZ(Jump if Not Zero)是两个条件跳转指令,它们根据标志寄存器中的 零标志位(Zero Flag,ZF)的状态来决定程序的跳转行为。两者的区别在于跳转的条件相反。

1. JZ(Jump if Zero)

功能:

  • 零标志位(ZF) 被设置为1时,JZ 指令执行跳转。

使用场景:

  • 主要用于检查某个操作的结果是否为零。如果操作结果为零(例如两个值相等,或减法结果为零),那么 ZF 被置为1,此时 JZ 将会跳转到指定的目标地址。

示例:

bash 复制代码
CMP AX, BX  ; 比较 AX 和 BX 的值
JZ  target  ; 如果 AX == BX,ZF 被置1,跳转到 target 标签

在上面的例子中,如果 AXBX 相等,CMP 指令会将 ZF 设置为 1,JZ 指令将跳转到 target 标签。

2. JNZ(Jump if Not Zero)

功能:

  • 零标志位(ZF) 被设置为0时,JNZ 指令执行跳转。

使用场景:

  • 用于检查某个操作的结果是否 为零。如果操作结果不为零(例如两个值不相等,或减法结果不为零),那么 ZF 被清零,此时 JNZ 将会跳转到指定的目标地址。

示例:

bash 复制代码
CMP AX, BX  ; 比较 AX 和 BX 的值
JNZ target  ; 如果 AX != BX,ZF 被清零,跳转到 target 标签

在上面的例子中,如果 AXBX 不相等,CMP 指令会将 ZF 设置为 0,JNZ 指令将跳转到 target 标签。

总结

  • JZ (Jump if Zero)会在 ZF = 1 时跳转,通常用于检查操作结果是否为零。
  • JNZ (Jump if Not Zero)会在 ZF = 0 时跳转,通常用于检查操作结果是否不为零。

这两个指令通常在需要基于条件执行不同路径的程序中用来实现条件分支。


举两个例子就懂了

示例:检查内存单元首地址2200H起的50个字节与首地址3200H起的50个字节是否相等
bash 复制代码
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。
bash 复制代码
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:
; 继续其他代码

嗨,我是命运之光。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉 ,获取最新动态,⚡️ 让信息传递更加迅速。

相关推荐
CYX_cheng11 分钟前
算法基础-二分查找
算法
mikey棒棒棒28 分钟前
算法练习题25——合并多项式
java·算法·hashmap·哈希·多项式
i嗑盐の小F28 分钟前
【IEEE&ACM Fellow、CCF组委】第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)
人工智能·深度学习·算法·机器学习·自然语言处理·信号处理
DANGAOGAO29 分钟前
蓝桥杯4. Fizz Buzz 经典问题
算法·蓝桥杯
MengYiKeNan1 小时前
C++二分函数lower_bound和upper_bound的用法
开发语言·c++·算法
戊子仲秋1 小时前
【LeetCode】每日一题 2024_9_19 最长的字母序连续子字符串的长度(字符串,双指针)
算法·leetcode·职场和发展
小林熬夜学编程1 小时前
C++第五十一弹---IO流实战:高效文件读写与格式化输出
c语言·开发语言·c++·算法
蠢蠢的打码2 小时前
8584 循环队列的基本操作
数据结构·c++·算法·链表·图论
程序猿进阶4 小时前
如何在 Visual Studio Code 中反编译具有正确行号的 Java 类?
java·ide·vscode·算法·面试·职场和发展·架构
Eloudy4 小时前
一个编写最快,运行很慢的 cuda gemm kernel, 占位 kernel
算法