汇编

1. jg(Jump if Greater)

  • 含义: 如果第一个操作数大于第二个操作数,则跳转。

  • 应用场景: 用于有符号数的比较

  • 条件:

    • (ZF = 0) 且 (SF = OF)
    • ZF = 0 确保两个数不相等。
    • SF = OF 表示符号位没有溢出,比较结果有效。
  • 示例:

    cmp eax, ebx jg greater_label


2. ja(Jump if Above)

  • 含义: 如果第一个操作数大于第二个操作数,则跳转。

  • 应用场景: 用于无符号数的比较

  • 条件:

    • (CF = 0) 且 (ZF = 0)
    • CF = 0 表示第一个操作数没有借位。
    • ZF = 0 确保两个数不相等。
  • 示例:

    cmp eax, ebx ja above_label


3. jl(Jump if Less)

  • 含义: 如果第一个操作数小于第二个操作数,则跳转。

  • 应用场景: 用于有符号数的比较

  • 条件:

    • (SF ≠ OF)
    • 符号位和溢出标志不同,表示第一个操作数小于第二个操作数。
  • 示例:

    cmp eax, ebx jl less_label


4. jb(Jump if Below)

  • 含义: 如果第一个操作数小于第二个操作数,则跳转。

  • 应用场景: 用于无符号数的比较

  • 条件:

    • (CF = 1)
    • 进位标志位被置位,表示第一个操作数小于第二个操作数。
  • 示例:

    cmp eax, ebx jb below_label


5. je(Jump if Equal)

  • 含义: 如果两个操作数相等,则跳转。

  • 应用场景: 无论有符号还是无符号比较都适用。

  • 条件:

    • (ZF = 1)
    • 零标志位被置位,表示比较结果为零(即两个数相等)。
  • 示例:

    cmp eax, ebx je equal_label


6. jne(Jump if Not Equal)

  • 含义: 如果两个操作数不相等,则跳转。

  • 应用场景: 无论有符号还是无符号比较都适用。

  • 条件:

    • (ZF = 0)
    • 零标志位没有置位,表示比较结果非零(即两个数不相等)。
  • 示例:

    cmp eax, ebx jne not_equal_label


7. jle(Jump if Less or Equal)

  • 含义: 如果第一个操作数小于或等于第二个操作数,则跳转。

  • 应用场景: 用于有符号数的比较

  • 条件:

    • (ZF = 1) 或 (SF ≠ OF)
    • 要么两个数相等,要么符号位和溢出标志不同,表示第一个操作数小于第二个操作数。
  • 示例:

    cmp eax, ebx jle less_or_equal_label


8. jbe(Jump if Below or Equal)

  • 含义: 如果第一个操作数小于或等于第二个操作数,则跳转。

  • 应用场景: 用于无符号数的比较

  • 条件:

    • (CF = 1) 或 (ZF = 1)
    • 要么借位发生(第一个操作数小于第二个操作数),要么两个数相等。
  • 示例:

    cmp eax, ebx jbe below_or_equal_label


总结:有符号 vs. 无符号

指令有符号无符号
Greaterjgja
Lessjljb
Greater or Equaljgejae
Less or Equaljlejbe

注意

  • 有符号指令依赖符号位(SF)和溢出标志(OF)。
  • 无符号指令依赖进位标志(CF)。

这两类指令的用途取决于数据的类型(有符号或无符号),在实际代码中需要根据具体的逻辑需求选择合适的跳转指令。