【微机原理】指令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:
; 继续其他代码

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

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

相关推荐
猿人谷7 小时前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络8 小时前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络8 小时前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4008 小时前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4008 小时前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法
JieE2122 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2123 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack203 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树3 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2124 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法