汇编语言指令 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版)》王爽

相关推荐
LDR00612 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术12 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园12 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob12 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享12 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.12 天前
C语言--day30
c语言·开发语言
何以解忧,唯有..12 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽12 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下12 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
飞天狗11112 天前
零基础JavaWeb入门——第五课第二小节:九大内置对象 · 第2个:response(响应对象)
java·开发语言