代码 :
assume cs:code,ds:data
data segment
dw 1234H, 5678H
data ends
code segment
start:
mov ax, data
mov ds, ax
jmp dword ptr ds:[0]
finish:
mov ax,4cH
int 21H
code ends
end start
反编译结果 :
总结 :
我们知道要读取内存中的数据的时候需要指明读取数据的长度
那么如果我们将跳转的目标地址保存在内存中的话 , 要读取内存中的数据也肯定是要指明数据的长度
在之前的课程中我们指导 jmp 可以有这几种跳转方式 :
1. 段内短转移
根据偏移来进行跳转 , 操作码中并不包含地址 , 只包含偏移
jmp short [Symbol]
只修改 ip 的低 8 位 , 由编译器计算
2. 段内近转移
根据偏移来进行跳转 , 操作码中并不包含地址 , 只包含偏移
jmp near ptr [Symbol]
修改 ip 的所有 16 位 , 由编译器计算
3. 段间转移 (远转移)
根据目标地址来进行跳转
jmp far ptr [Symbol]
同时修改 cs 和 ip , 由编译器计算
4. 寄存器转移 (似乎并不能 jmp al , 或者 jmp ah)
jmp ax
修改 ip 的所有位 , 由运行时确定
第一种 :
jmp word ptr [address]
从内存中取 16 位数据
第二种 :
jmp dword ptr [address]
从内存中取 32 位数据
其中高地址是段地址
低地址是偏移地址
由于这里的目标地址是在内存中的 , 因此存在不确定性
因此真正跳转的地址也是在运行时才能确定