无条件跳跃

jmp a_label                      ;Jump to a_label
jmp bx                           ;Jump to address in BX
jmp WORD [aPointer]              ;Jump to address in aPointer
jmp 7c0h:0000h                   ;Jump to segment 7c0h and offset 0000h
jmp FAR WORD [aFarPointer]       ;Jump to segment:offset in aFarPointer

相对接近跳跃

jmp a_label 是:

  • near
    它只指定目标逻辑地址的偏移部分。该段被假定为 CS
  • 相对
    该指令语义是跳跃相对字节前进 1 从下一个指令地址或 IP = IP + rel

该指令编码为 EB <rel8>EB <rel16/32>,汇编程序选择最合适的形式,通常更喜欢较短的形式。
每个汇编程序覆盖是可能的,例如使用 NASM jmp SHORT a_labeljmp WORD a_labeljmp DWORD a_label 生成三种可能的形式。

绝对间接近距离跳跃

jmp bxjmp WORD [aPointer] 是:

  • near
    它们只指定目标逻辑地址的偏移部分。该段假设为 CS
  • 绝对间接
    指令的语义是跳转到 regmemIP = regIP = mem 中的地址。

该指令被编码为 FF /4,对于存储器间接,操作数的大小被确定为每隔一个存储器访问。

绝对远远的跳跃

jmp 7c0h:0000h 是:

  • far
    它指定逻辑地址的两个部分 :段和偏移量。

  • absolute 指令的语义跳转到地址段:offsetCS = segment, IP = offset

该指令根据代码大小编码为 EA <imm32/48>
可以在某些汇编程序中选择两种形式,例如使用 NASM jmp 7c0h: WORD 0000hjmp 7c0h: DWORD 0000h 生成第一种和第二种形式。

绝对间接远距离跳跃

jmp FAR WORD [aFarPointer] 是:

  • far 它指定逻辑地址的两个部分 :段和偏移量。

  • 绝对间接指令的语义是跳转到段: 存储在 mem 2CS = mem[23:16/32], IP = [15/31:0] 中的偏移量

该指令编码为 FF /5,操作数的大小可以是具有大小说明符的控制器。
在 NASM 中,有点不直观,它们是 16:16 操作数的 jmp FAR WORD [aFarPointer]16:32 操作数的 jmp FAR DWORD [aFarPointer]

缺少跳跃

  • 接近绝对
    可以用近间接跳跃模拟。

      mov bx, target            ;BX = absolute address of target
      jmp bx
    
  • 远亲
    无论如何都没有意义或太狭隘。

1 两个补码用于指定有符号偏移,从而向后跳转。
2 可以是 seg16:off16seg16:off32 ,大小为 16:1616:32