[037][汇编语言]jmp指令

jmp 指令

 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位位移
16位位移 = 要跳转去的标号地址 - 减去jmp指令后第一条指令的起始地址

16位位移的范围是:-32768~32767
16位位移使用 补码 形式表示

jmp far ptr 标号

  • 段间转移,远转移
  • 用标号所在段地址和偏移地址修改CS和IP
(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
  • 读出目的段地址和目的偏移地址


    jmp far ptr 标号
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一样的了

jmp word ptr 内存单元地址

  • 段内转移,只修改偏移地址
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]

执行后 (IP)=0123H

jmp dword ptr 内存单元地址

  • 段间转移
  • 高地址目的段地址低地址目的偏移地址
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]

执行后 (CS)=0, (IP)=0123H,
CS:IP 指向 0000:0123H

附注3:MASM.EXE对JMP的相关处理

  • 1、向前转移 disp属于[-128,127]
assume cs:code
code segment
s:  jmp s
    jmp short s
    jmp near ptr s
    jmp far ptr s
    
code ends
end s
1、向前转移 disp属于[-128,127].png
  • 2、向前转移 disp属于[-32768,32767]
assume cs:code
code segment
s:  db 100 dup (0b8h,0,0)
    ;jmp short s
    jmp s
    jmp near ptr s
    jmp far ptr s
    
    code ends
    end s
2、向前转移 disp属于[-32768,32767].png
  • 3、向后转移 disp属于[-128,127] EB+disp+NOP 一个NOP存放8位disp
assume cs:code
code segment
begin:  jmp short s
        jmp s
        jmp near ptr s
        jmp far ptr s 
    s:  mov ax,0
    code ends
    end begin
3、向后转移 disp属于[-128,127] EB+disp+NOP 一个NOP存放8位disp.png
  • 4、向后转移 disp属于[-32767,32768]
assume cs:code
code segment
begin:  ;jmp short s
        jmp s
        jmp near ptr s
        jmp far ptr s
        db 100 dup (0b8h,0,0)
    s:  mov ax,2
    code ends
    end begin
4、向后转移 disp属于[-32767,32768].png

你可能感兴趣的:([037][汇编语言]jmp指令)