汇编语言指令 jmp: jmp word ptr、jmp dword ptr、jmp 寄存器

1. 转移地址在内存中的jmp指令有2种形式

1.1 jmp word ptr 内存单元地址

jmp word ptr 内存单元地址是段内转移指令,也就是说该指令只修改IP值,其功能是控制CPU下一条执行的指令是一个字(2个字节)内存中存放的偏移地址所指向的指令。所以,IP和内存单元地址存在关系:(IP) = (内存单元地址)

例如:

mov ax, 12h

mov ds:[0], ax

jmp word ptr ds:[0]

执行该段代码后,(IP) = 0012h

cpp 复制代码
assume cs:code, ds:data
data segment
    dw 8 dup (0)   ;定义8个2字节的dw类型数据,并初始化为0
data ends
code segment
start:
    mov ax, data            
    mov ds, ax              

    mov ax, 12h             
    mov ds:[0], ax          
    jmp word ptr ds:[0]     ;执行该指令后,IP = 0012h

    mov ax, 0               
    add ax, 2               
    inc ax

    mov ax, 4c00h
    int 21h
code ends
end start

1.2 jmp dword ptr 内存单元地址

jmp dword ptr 内存单元地址是段间转移指令,也就是说该指令可以同时修改CS和IP值,其功能是控制CPU下一条执行的指令在两个字大小的内存中,其中高字(2字节)内存中存放的是目的段地址(CS),低字(2字节)内存中存放的是目的偏移地址(IP)。

所以,CS和IP跟内存单元地址之间存在以下关系:

(1)(CS) = (内存单元地址+2)

(2)(IP) = (内存单元地址)

例如:

mov ax, 18h

mov ds:[0], ax

mov word ptr ds:[2], 204Eh

jmp dword ptr ds:[0]

;执行该段指令后,CS = 204Eh, IP = 0018h

cpp 复制代码
assume cs:code, ds:data
data segment
    dd 4 dup (0)   ;定义4个4字节的dd类型数据,并初始化为0
data ends
code segment
start:
    mov ax, data            
    mov ds, ax              

    mov ax, 18h             
    mov ds:[0], ax              ;低字内存中存放IP
    mov word ptr ds:[2], 204Eh  ;高字内存中存放CS     
    jmp dword ptr ds:[0]     ;执行该指令后,CS = 204Eh, IP = 0018h

    mov ax, 0               
    add ax, 2               
    inc ax

    mov ax, 4c00h
    int 21h
code ends
end start

2. 目的地址在寄存器中的jmp指令

2.1 jmp 16位寄存器

目的地址在寄存器中的jmp指令是段内转移指令,只能修改IP,所以IP和寄存器间存在关系:(IP) = (16位寄存器)

例如

mov ax, 0123h

jmp ax ;执行该指令后,(IP) = 0123h

又例如

mov bx, 0123h

jmp bx ;;执行该指令后,(IP) = 0123h

3. 总结

  1. jmp word ptr 内存单元地址 是段内转移指令,只修改IP:(IP) = (内存单元地址)

  2. jmp dword ptr 内存单元地址 是段间转移指令,同时修改CS和IP:

(CS) = (内存单元地址 + 2),(IP) = (内存单元地址)

参考文献

《汇编语言(第4版)》王爽

相关推荐
提笔忘字的帝国18 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
flysh0518 小时前
C# 架构设计:接口 vs 抽象类的深度选型指南
开发语言·c#
2501_9418824818 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
bkspiderx18 小时前
C++中的volatile:从原理到实践的全面解析
开发语言·c++·volatile
沛沛老爹19 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理
专注_每天进步一点点19 小时前
【java开发】写接口文档的札记
java·开发语言
代码方舟19 小时前
Java企业级实战:对接天远名下车辆数量查询API构建自动化风控中台
java·大数据·开发语言·自动化
flysh0519 小时前
C# 中类型转换与模式匹配核心概念
开发语言·c#
AC赳赳老秦19 小时前
Python 爬虫进阶:DeepSeek 优化反爬策略与动态数据解析逻辑
开发语言·hadoop·spring boot·爬虫·python·postgresql·deepseek
浩瀚之水_csdn19 小时前
Python 三元运算符详解
开发语言·python