JCC(Jump on Condition Codes)条件跳转指令笔记

JCC 指令是一组根据标志寄存器的状态进行条件跳转的指令集合。这些指令通过检查标志位的值来决定是否执行跳转。

一、基于相等/不相等的跳转指令

  1. JE/JZ(Jump if Equal/Jump if Zero)

    • ZF = 1 时跳转
    • 常用场景:判断两个值是否相等
    cmp eax, ebx    ; 比较 eax 和 ebx
    je  label       ; 如果相等,跳转到 label
    
  2. JNE/JNZ(Jump if Not Equal/Jump if Not Zero)

    • ZF = 0 时跳转
    • 常用场景:判断两个值是否不相等
    cmp eax, ebx    ; 比较 eax 和 ebx
    jne label       ; 如果不相等,跳转到 label
    

二、基于大小比较的跳转指令(无符号数)

  1. JB/JNAE(Jump if Below/Jump if Not Above or Equal)

    • CF = 1 时跳转
    • 常用场景:无符号数比较,判断是否小于
    cmp eax, ebx    ; 比较 eax 和 ebx
    jb  label       ; 如果 eax < ebx,跳转到 label
    
  2. JBE/JNA(Jump if Below or Equal/Jump if Not Above)

    • CF = 1ZF = 1 时跳转
    • 常用场景:无符号数比较,判断是否小于等于
    cmp eax, ebx    ; 比较 eax 和 ebx
    jbe label       ; 如果 eax <= ebx,跳转到 label
    
  3. JA/JNBE(Jump if Above/Jump if Not Below or Equal)

    • CF = 0ZF = 0 时跳转
    • 常用场景:无符号数比较,判断是否大于
    cmp eax, ebx    ; 比较 eax 和 ebx
    ja  label       ; 如果 eax > ebx,跳转到 label
    
  4. JAE/JNB(Jump if Above or Equal/Jump if Not Below)

    • CF = 0 时跳转
    • 常用场景:无符号数比较,判断是否大于等于
    cmp eax, ebx    ; 比较 eax 和 ebx
    jae label       ; 如果 eax >= ebx,跳转到 label
    

三、基于大小比较的跳转指令(有符号数)

  1. JL/JNGE(Jump if Less/Jump if Not Greater or Equal)

    • SF ≠ OF 时跳转
    • 常用场景:有符号数比较,判断是否小于
    cmp eax, ebx    ; 比较 eax 和 ebx
    jl  label       ; 如果 eax < ebx,跳转到 label
    
  2. JLE/JNG(Jump if Less or Equal/Jump if Not Greater)

    • ZF = 1SF ≠ OF 时跳转
    • 常用场景:有符号数比较,判断是否小于等于
    cmp eax, ebx    ; 比较 eax 和 ebx
    jle label       ; 如果 eax <= ebx,跳转到 label
    
  3. JG/JNLE(Jump if Greater/Jump if Not Less or Equal)

    • ZF = 0SF = OF 时跳转
    • 常用场景:有符号数比较,判断是否大于
    cmp eax, ebx    ; 比较 eax 和 ebx
    jg  label       ; 如果 eax > ebx,跳转到 label
    
  4. JGE/JNL(Jump if Greater or Equal/Jump if Not Less)

    • SF = OF 时跳转
    • 常用场景:有符号数比较,判断是否大于等于
    cmp eax, ebx    ; 比较 eax 和 ebx
    jge label       ; 如果 eax >= ebx,跳转到 label
    

四、其他常用条件跳转指令

  1. JC(Jump if Carry)

    • CF = 1 时跳转
    • 常用场景:检查是否发生进位
    add eax, ebx    ; 加法运算
    jc  label       ; 如果有进位,跳转到 label
    
  2. JNC(Jump if Not Carry)

    • CF = 0 时跳转
    • 常用场景:检查是否没有发生进位
    add eax, ebx    ; 加法运算
    jnc label       ; 如果没有进位,跳转到 label
    
  3. JO(Jump if Overflow)

    • OF = 1 时跳转
    • 常用场景:检查是否发生溢出
    add eax, ebx    ; 加法运算
    jo  label       ; 如果发生溢出,跳转到 label
    
  4. JNO(Jump if Not Overflow)

    • OF = 0 时跳转
    • 常用场景:检查是否没有发生溢出
    add eax, ebx    ; 加法运算
    jno label       ; 如果没有溢出,跳转到 label
    

实际应用示例

; 循环示例:计数从10递减到0
    mov ecx, 10         ; 初始化计数器
loop_start:
    ; 循环体
    dec ecx            ; 计数器减1
    cmp ecx, 0         ; 比较计数器与0
    jg  loop_start     ; 如果计数器>0,继续循环

; 条件判断示例
    cmp eax, 100       ; 比较 eax 与 100
    jge greater_equal  ; 如果 eax >= 100,跳转
    jl  less_than      ; 如果 eax < 100,跳转

小结

  • JCC指令是汇编语言中实现程序控制流程的重要工具
  • 它们基于标志寄存器的状态进行跳转
  • 分为无符号比较和有符号比较两大类
  • 使用时需要注意选择正确的跳转指令,特别是在处理有符号数和无符号数时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值