JMP指令

JMP指令:跳转指令

功能等同于 MOV EIP

用法:

 jmp short 标号
 jmp near ptr 标号
 jmp far ptr 标号
 jmp 16位reg
 jmp word ptr  内存单元地址
 jmp dword ptr 内存单元地址

——————————

jmp short 标号

段内短转移
对IP的修改范围是-128~127
向前 移动时可以最多越过128个字节,向后 移动可以最多越过127个字节
依据位移进行转移,转移指令结束后,CS:IP指向标号处的指令
(IP)=(IP)+8位位移
8位位移 = 要跳转去的标号地址 - 减去jmp指令后第一条指令的起始地址
8位位移的范围是:-128~127
8位位移使用 补码 形式表示

依据位移进行转移,跳转到标号s处开始执行指令

assume cs:codesg
codesg segment
    start:  mov ax,0
            mov bx,0
            jmp short s
            add ax,1
        s:  inc ax
    codesg ends
    end start

——————————

jmp near ptr 标号

段内近转移
(IP)=(IP)+16位位移
(CS) = 标号所在段的段地址
(IP) = 标号在段中的偏移地址
依据段地址和偏移地址进行转移
assume cs:codesg
codesg segment
    start:  mov ax,0
            mov bx,0
            jmp far ptr s
            db 256 dup (0)
        s:  add ax,1
            inc ax
    codesg ends
    end start

读出目的段地址和目的偏移地址

0B016A07

0B
01
-----
010B 目的偏移地址

6A
07
----
076A 目的段地址

CS:IP 指向 076A:010B

—————————————————

jmp 16位reg

jmp 某一合法寄存器 : 用寄存器中的值修改IP寄存器中的值
jmp ax 
指令执行前 ax=1000H CS=2000H IP=0003H
指令执行后 ax=1000H CS=2000H IP=1000H

IP寄存器中的值被修改成和ax一样的了