代码 :
assume cs:code
code segment
start:
mov ax, 0000H
mov bx, 0000H
jmp far ptr finish
db 256 dup(0)
; 定义一段 256 字节的数据
; 这样就不能再使用 jmp short [Symbol] 这样的指令了
; 因为偏移已经超过了 8 位二进制数能表示的范围了
finish:
mov ax,4cH
int 21H
code ends
end start
反汇编结果 :
总结 :
可以看到 :
jmp far ptr [Symbol]
该指令将会同时修改 cs 和 ip
而且 , 直接观察二进制的指令 , 可以发现 :
jmp far ptr finish
EA 0B01 500B
后面的操作数 :
010B -> ip
0B50 -> cs
因此可以发现 :
该汇编代码在被编译器进行编译的时候
编译器会计算目标地址在运行时候的物理地址
然后使用物理地址作为 jmp 指令的操作数来进行跳转