无条件跳跃
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_label
,jmp WORD a_label
和 jmp DWORD a_label
生成三种可能的形式。
绝对间接近距离跳跃
jmp bx
和 jmp WORD [aPointer]
是:
- near
它们只指定目标逻辑地址的偏移部分。该段假设为CS
。 - 绝对间接
指令的语义是跳转到 reg 或 mem 或IP = reg
,IP = mem
中的地址。
该指令被编码为 FF /4
,对于存储器间接,操作数的大小被确定为每隔一个存储器访问。
绝对远远的跳跃
jmp 7c0h:0000h
是:
-
far
它指定逻辑地址的两个部分 :段和偏移量。 -
absolute 指令的语义跳转到地址段:offset 或
CS = segment, IP = offset
。
该指令根据代码大小编码为 EA <imm32/48>
。
可以在某些汇编程序中选择两种形式,例如使用 NASM jmp 7c0h: WORD 0000h
和 jmp 7c0h: DWORD 0000h
生成第一种和第二种形式。
绝对间接远距离跳跃
jmp FAR WORD [aFarPointer]
是:
-
far 它指定逻辑地址的两个部分 :段和偏移量。
-
绝对间接指令的语义是跳转到段: 存储在 mem 2 或
CS = 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:off16 或 seg16:off32 ,大小为 16:16 和 16:32 。