jmp指令2

jmp指令――无条件转移

  • jmp指令的功能
    • 无条件转移,可以只修改IP,也可以同时修改CS和IP
  • jmp指令要给出两种信息:
    • 转移的目的地址
    • 转移的距离
      • 段间转移(远转移):jmp 2000:1000
      • 段内短转移:jmp short 标号; IP的修改范围为-128~127,8位的位移
      • 段内近转移:jmp near ptr 标号;IP的修改范围为-32768~32767,16位的位移

jmp指令:依据位移进行转移

  • 引子:常见指令中的立即数均在机器指令中有体现
  • 问题:jmp short 指令中,转移到了哪里?
    • jmp short的机器指令中,包含的是跳转到指令的相对
      位置,而不是转移的目标地址。
  • 左边程序jmp short s指令的读取和执行:
    1. (IP)=0003,CS:IP指向EB 05(jmp的机器码)
    2. 读取指令码EB05进入指令缓冲器;
    3. (IP)=(IP)+所读取指令的长度=(IP)+2=0005 CS:IP指向add ax, 0001 ;
    4. CPU执行指令缓冲器中的指令EBO5;
    5. 指令EB执行后,(IP)=(IP)5-0Q0AH ,CS:IP指向inc ax

在这里插入图片描述

两种段内的转移

  • 短转移:“jmp short 标号”

    • 功能:§=(IP)+8位位移
    • 原理
      1. 8位位移="标号"处的地址-jmp指令后的第一个字节的地址;
      2. short指明此处的位移为8位位移;
      3. 位位移的范围为-128~127,用补码
        表示;
      4. 8位位移由编译程序在编译时算出。
  • 近转移:指令"jmp near ptr标号”

    • 功能:(IP)=(IP)+16位位移
    • 原理
      1. 16位位移=“标号"”处的地址-jmp指令后的第一个字节的地址;
      2. near ptr指明此处的位移为16位位移,进行的是段内近转移;
      3. 16位位移的范围为-32769~32767,用补码表示;
      4. 16位位移由编译程序在编译时算出。
  • 远转移jmp far ptr标号

    • 段间转移
    • far ptr指明了跳转到的目的地址,即包含了标号的段地址cs和偏移地址IP。
  • 段内转移

    • near ptr指明了相对于当前IP的转移位移,而不是转移的目的地址。

转移地址在寄存器中的jmp指令

  • 指令格式:jmp 16位寄存器
    • 功能:IP= (16位寄存器
    • 举例∶
      • jmp ax
      • jmp bx,

转移地址在内存中的jmp指令

  • jmp word ptr内存单元地址(段内转移
    • 功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址
mov ax,0123H			
mov ds:[0],ax 				
jmp word ptr de:[0]		
;执行后,(IP)=0123H		
mov ax,0123H
mov [bx],ax
jmp word ptr [bx]
;执行后,(IP)=0123H
  • jmpdworo ptr内存单元地址(段间转移
    • 功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
;执行后,(CS)=0(IP)=0123H
;CS:IP指向0000:0123
mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
;执行后(CS)=0(IP)=0123H
jmp指令格式示例
jmp 标号段间转移(远转移): jmp far ptr 标号 段内短转移:jmp short 标号;8位的位移 段内近转移:jmp near ptr 标号; 16位的位移
jmp 寄存器jmp bx; 16位的位移
jmp 内存单元(表示跳转到的地址)段内转移:jmp word ptr 内存单元地址;jmp word ptr [bx] 段间转移:jmp dword ptr 内存单元地址;jmp dword ptr [bx]
  • 在源程序中,不允许使用“jmp 2000:0100”的转移指令实现段间转移·

    • 这是在Debug中使用的汇编指令,汇编编译器并不认识

    • 如果在源程序中使用,编译时也会报错。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值