转移指令的原理

原创 2016年06月11日 15:17:29
    可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括来讲,转移指令就是可以控制CPU执行内存中
某处代码的指令。

    8086CPU的转移指令有以下几类。
        (1)只修改IP时,称为段内转移,比如:jmp ax。
        (2)同时修改CS和IP时,称为段间转移,比如:jmp 1000:0

    由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移。
        (1)短转移IP的修改范围为-128~127.
        (2)近转移IP的修改范围为—32768~32767.

    8086CPU的转移指令分为以下几类。
        (1)无条件转移指令(如:jmp)
        (2)条件转移指令。
        (3)循环指令(如:loop)
        (4)过程
        (5)中断

jmp指令

    jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。

    jmp指令要求给出两种信息:
        (1)转移的目的地址
        (2)转移的距离(段间转移,段内短转移,短内近转移)

    jmp short 标号
    转到标号处执行指令,这种格式的jmp指令实现的时段内短转移,他对IP的修改范围为
—128~127,“short”标号说明指令进行的时短转移。

    汇编指令中的idata(立即数),不论它是表示一个数据还是内存单元的偏移地址,都会在对应的机器指令
中出现,因为CPU执行的时机器指令,他必须要处理这些数据或地址。

(http://img.blog.csdn.net/20160611135522461)

    由图中jmp 0008的机器码可知,cpu在执行jmp指令的时候并不需要转移的目的地址。实际上jmp在机器码
中并未给出转移的目的地址,而是给出了转移的位移。jmp 0008这条指令要使(IP)=0008H,而当前的(IP)
=0005H,而当前IP加0003H正好为目的地址。

    ps:
        为什么会说当前(IP)为0005H而不是0003H呢.
        因为CPU执行指令的步骤如下
        (1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲区。
        (2)(IP)=(IP)+所读取指令的长度,从而指向下一条指令。
        (3)执行指令。转到1,重复执行这个过程。
        实际上我们是先增加了当前(IP)之后才执行指令,所以在执行指令时的当前(IP)是下一条指令的
    开始处的(IP)。

    实际上“jmp short 标号”的功能是:(IP)=(IP)+8位位移(8位位移=标号出地址-jmp指令后的第一个
字节的地址,这8位位移由编译程序在编译时算出)。

    而“jmp near ptr标号”的功能为:(IP)=(IP)+16位位移(其它情况同上)。

    前面两个均是段内转移,且对应的机器指令中并没有转移的目的地址,而是相对于当前IP的转移地址,
而“jmp far ptr 标号”实现的是段间转移,又称为远转移。far ptr指明了指令用标号的段地址和偏移地址修
改CS和IP。
    eg:
        assume cs:code
        code segment
         start:
             mov ax,0
             mov bx,0
             jmp far ptr s  ;CS:IP为0BBD:0006 机器指令为:EA0B01BD0B
             db 256 dup (0)
         s:
             add ax,1 ;s对应的CS:IP为0BBD:010B
             inc ax
        code ends
        end start
    由上可之,段间转移会给出转移的目的地址,而不同段内转移给出的转移位移。

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

    指令格式:jmp 16位reg
    功能:(IP)=(16位reg)

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

    (1)jmp word ptr 内存单元地址(段内转移)
        功能:从内存单元地址开始存放着一个字,是转移的目的偏移地址(内存单元地址可用寻址的任意一
    种格式给出)。
        eg:
            mov ax.0123H
            mov [bx],ax
            jmp word ptr [bx]
            执行后,(IP)=0123H

    (2)jmp dword ptr 内存单元地址(段间转移)
        功能:
        从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移
    地址。
        (CS)=(内存单元地址+2)
        (IP)=(内存单元地址)
        eg:
            mov ax,0123H
            mov [bx],ax
            mov word ptr [bx+2],0
            jmp dword ptr [bx]
            执行后,(CS)=0,(IP)=0123H,CS:IP指向0000:0123

汇编编译器(masm.exe)对jmp的相关处理

    1.向前转移
        编译器中有一个地址计数器(AC),编译器在编译过程中,每读到一个字节AC就加1。再向前转移时,
    编译器可以在读到标号s后记下AC的值as,在读到jmp s后记下AC的值aj。编译器用as-aj算出位移disp。

        (1)如果disp为[-128,127],则不管汇编指令是:
            jmp s
            jmp short s
            jmp near ptr s
            jmp far ptr s
中的哪一种,都将其转换为jmp short s对应的机器码(EB disp)。

        (2)如果disp为[-32768,32767],则:
            对于jmp short s将产生编译错误。
            对于jmp s,jmp near ptr s将产生jmp near ptr s对应的机器码(E9 disp)。
            对于jmp far ptr s将产生相应的编码,jmp far ptr s所对应的机器码格式为:
EA 偏移地址 段地址。

2.向后转移
        在向后转移的情况下,编译器先读到jmp s指令。由于它还没有读到标号s,所以编译器此时还不能确
    定标号s处的AC值。也就是说,编译器不能确定位移量disp的大小。

        此时,编译器将jmp s指令都当作jmp short s来读取,记下jmp s指令的位置和AC的值aj,并作如下
    处理:

        对于jmp short s,编译器生成EB和1个nop指令(相当于预留一个字节的空间,存放8位的disp)。

        对于jmp s和jmp near ptr s,编译器生成EB和2个nop指令(相当于预留两个字节的空间,存放16
    位的disp)。

        对于jmp far ptr s,编译器生成EB和4个nop指令(相当于预留4个字节的空间,存放16位的
    disp)。

        做完上述处理后,编译器继续运行,当向后读到标号s时,记下AC的值as,并计算出转移的位移量:
    disp=as-aj。

汇编语言之转移指令和原理

 1、引言 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存 中某处代码的指令。 8086CPU的转移行为有以下几类: 1. 同时修改...
  • u011068702
  • u011068702
  • 2016年10月31日 20:13
  • 1860

【汇编语言/底层开发】9、转移指令的原理

可以修改IP或者同时修改CS和IP的指令统称为转移指令。转移指令控制CPU执行内存中某处的代码,其作用相当于C语言中的GOTO。 1、操作符Offset; 2、jmp指令: jmp为无条件跳转指令,可...
  • shaqoneal
  • shaqoneal
  • 2015年01月07日 22:38
  • 757

51单片机控制转移指令的一些理解

控制转移指令的功能是改变指令的执行顺序,转到指令的指示的新的PC地址执行。         MCS-51单片机的控制转移指令有以下几钟类型: 无条件转移:无需判断,执行该指令就转移到目的地...
  • chenxi2007
  • chenxi2007
  • 2012年09月26日 15:40
  • 1514

[汇编]8086指令系统---控制转移指令

[汇编]8086指令系统---控制转移指令(一) 控制转移指令通过改变CS:IP来控制程序的执行流程。这类指令包括无条件转移指令、条件转移指令、循环指令、子程序调用和返回指令以及中断和中断返回指令。...
  • zhu2695
  • zhu2695
  • 2013年11月18日 22:32
  • 1584

汇编语言-转移指令的原理

汇编语言-转移指令的原理
  • daiyibo123
  • daiyibo123
  • 2015年11月08日 18:36
  • 465

自己动手写CPU之第八阶段(1)——转移指令介绍

本章将为OpenMIPS处理器添加转移指令,转移指令包括跳转、分支两种,区别在于前者是绝对转移,后者是相对转移,但实现方法是相似的。转移指令涉及延迟槽,所以首先在8.1节介绍了延迟槽的概念,接着在8....
  • leishangwen
  • leishangwen
  • 2014年09月15日 00:08
  • 3155

汇编语言——寻址方式的综合应用及转移指令的原理

一、 实验目的 定位内存单元的寻址方式汇总 寻址方式的综合应用 转移指令的分类和原理 熟悉在显存中编程的方法 二、 实验内容及要求(一)寻址方式的汇总及综合应用 定位内存单元的寻址方式有几...
  • aurorayqz
  • aurorayqz
  • 2017年05月10日 23:13
  • 395

8086条件转移指令JE,JZ

JZ/JE 指令格式 转移条件 说明 JZ/JE 标号 ZF=1 等于0或相等转移 code segment assume cs:code mov ax,2 mov bx,2 ...
  • u010976120
  • u010976120
  • 2013年06月18日 11:42
  • 2667

(9)转移指令的原理

1、跳转就是修改IP,或同时修改CS,这样达到指令到另一位置执行的目的。 2、offset偏移量       就是段开始到标号处处的相对距离,,这个段不一定非得是CS       mov...
  • dzweather
  • dzweather
  • 2012年12月08日 19:31
  • 501

汇编语言转移指令规则汇总

摘要:虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断。80x86条件跳转指令提供了这种判断。条件跳转指令是创建循环和实现其他条件执行语句,如if…endif的基本要素。 ...
  • trochiluses
  • trochiluses
  • 2014年02月17日 21:50
  • 2391
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:转移指令的原理
举报原因:
原因补充:

(最多只允许输入30个字)