目标地址在内存中的 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 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 位数据
其中高地址是段地址
低地址是偏移地址

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容