汇编——比较指令和条件跳转指令

📅 2026/7/1 3:00:24
汇编——比较指令和条件跳转指令
CMP 比较指令格式CMP 操作数1, 操作数2原理等价于 操作数1−操作数2不保存运算结果仅修改CF、ZF、OF、AF、PF、SF所有状态标志位作用配合条件跳转指令做判断对应高级语言 if/else 逻辑常用组合无符号数比较指令含义判定条件英文释义JE / JZ相等则跳转ZF 1Equal / ZeroJNE / JNZ不相等则跳转ZF 0Not Equal / Not ZeroJB / JC低于小于则跳转CF 1Below / CarryJNB / JNC不低于大于等于则跳转CF 0Not Below / Not CarryJA高于大于则跳转CF0 且 ZF0AboveJNA不高于小于等于则跳转CF1 或 ZF1Not Above补充别名 JB JNAE不高于等于JNB JAE高于等于TEST 测试指令格式TEST 操作数1, 操作数2原理执行 按位与 (AND) 运算不修改两个操作数本身仅刷新 SF、ZF、PF强制置 CF0、OF0典型用法检测某一个二进制位是否为 1TEST AL, 01H ; 检测AL最低位 //汇编中写注释用;; 最低位1 → 与运算结果≠0 → ZF0; 最低位0 → 与运算结果0 → ZF1判断寄存器是否为 0TEST EAX, EAX ; 自身按位与; EAX0 → ZF1EAX≠0 → ZF0判断正负结合 SF 符号位判断数据正负条件跳转指令总表按标志位分类跳转指令紧跟 CMP/TEST/ 运算指令根据前序指令产生的标志位判断是否跳转基于 ZF 零标志位● JZ / JEZF1结果为 0 / 两数相等跳转● JNZ / JNEZF0结果非 0 / 两数不等跳转基于 CF 进位 / 借位标志位多用于无符号数● JC / JB / JNAECF1有进位 / 借位 / 前者更小跳转● JNC / JNB / JAECF0无进位 / 借位 / 前者更大或相等跳转基于 OF 溢出标志位多用于有符号数● JOOF1运算溢出跳转● JNOOF0无溢出跳转基于 SF 符号标志位判断正负● JSSF1结果为负数跳转● JNSSF0结果为非负数正数 / 0跳转基于 PF 奇偶标志位● JP / JPEPF1结果低 8 位中二进制1的个数为偶数跳转● JNP / JPOPF0结果低 8 位中二进制1的个数为奇数跳转JMP 无条件跳转格式JMP 目标地址/标签说明不检测任何标志位直接跳转到指定位置执行代码对应高级语言 goto分类短跳转、近跳转、远跳转日常调试最常用短 / 近跳转区分CMP vs TEST○ CMP做减法用于数值大小、相等判断○ TEST做按位与用于位检测、判零、判正负有符号数 vs 无符号数跳转选择○ 无符号数比大小优先用 JA/JB/JNA/JNB依赖 CF、ZF○ 有符号数比大小使用 JG/JL 等专用指令依赖 SF、OF 组合顺序要求必须先执行 CMP/TEST/ 算术运算 修改标志位再使用跳转指令中间不能穿插会改变标志位的指令