目标地址在内存中的 jmp 指令


代码 :

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 指令_第2张图片
运行结果

总结 :

我们知道要读取内存中的数据的时候需要指明读取数据的长度
那么如果我们将跳转的目标地址保存在内存中的话 , 要读取内存中的数据也肯定是要指明数据的长度
在之前的课程中我们指导 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 位数据
其中高地址是段地址
低地址是偏移地址

由于这里的目标地址是在内存中的 , 因此存在不确定性
因此真正跳转的地址也是在运行时才能确定

你可能感兴趣的:(目标地址在内存中的 jmp 指令)