控制转移指令

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

控制转移指令

通常,程序中的指令都是顺序地逐条进行的,在8086中,指令的执行顺序由CS和IP 决出,每取出一条指令,指令指针IP自动进行调整,一条指令执行完成后,就从该指令之后的下一个存储单元中取出一条指令来执行。利用控制转移指令可以改变CS和IP的值,从而改变指令的执行顺序。为满足程序转移的不同要求,8086提供了无条件转移和过程调用、条件转移、循环控制以及中断指令等几类指令。

无条件转移指令和过程调用指令:JMP—无条件转移、CALL—过程调用、RET—过程返回条件转移:JZ\JE等十条指令—直接标志转移、JA\JNBE等8条指令—间接标志转移

条件循环控制:LOOP—CX≠0则循环、LOOPE和LOOPZ—CX≠0和ZF=1则循环、LOOPNE 和LOOPNE—CX≠0和ZF=0则循环、JCXZ—CX=0则循环

中断:INT—中断、INTO—溢出中断、IRET—中断返回

1、无条件转移和过程调用指令

1)JMP 无条件转移指令

指令格式:JMP 目的

指令功能:使程序无条件转移到指令中指定的目的地址去执行。

这类指令又分为两种类型:

第一种类型:段内转移或近(NEAR)转移,转移指令目的地址和JMP指令在同一代码段中,转移时仅改变IP寄存器的内容,段地址CS的值不变。

第二种类型:段间转移,又被称之为远(FAR)转移,转移指令的目的地址和JMP指令不在同一代码段中,发生转移时,CS和IP 的值都要改变也就是说,程序要转移到另一个代码段中去执行。

不论是段内还是段间转移,就转移地址提供的方式而言,又可分为两种方式:

第一种方式:直接转移,在指令码中直接给出转移的目的地址,目的操作数用一个标号来表示,它又分为段内直接转移和段间直接转移。

第二种方式:间接转移,目的地址包含在某个16位寄存器或存储单元中,CPU必须根据寄存器或存储器的寻址方式,间接地求出转移地址。同样,这类转移也可分为段内间接转移和段间间接转移。

所以无条件转移指令可分为段内直接转移、段内间接转移、段间直接转移、段间间接转移这四种不同类型和方式。

段内直接转移指令

指令格式:JMP SHORT 标号

JMP NEAR PTR 标号(或JMP 标号)

这是一种段内相对转移指令,目的操作数均用标号表示,程序转向的有效地址等于当前IP 寄存器内容加上8位或者16位位移量(DISP).如果位移量位是16位,那么表示近转移,说

明目的地址与当前的IP的距离在-32768~32767个字节之间。如果转移的范围在-128到127之内,则称为短转移,指令中只需要用8位位移量,它是近转移的一个特例。

在机器语言中,8位或16位位移量用带符号数表示,正的位移量表示向高地址方向转移,负的位移量表示向低地址方向转移,负位移量必须用补码表示。段内近—短转移指令的机器码及其操作功能如下如所示。

段内近转移指令

段内短转移指令

其中,第一个字节为操作码,后面的字节是位移量,注意,由于IP为16位长,当它与8位的位移量相加时,实际上使用符号扩展法将8位位移量扩展成16位数后才相加的。

在汇编语言语句中,目的操作数用符号地址也就是标号表示。对于位移量为16位的近转移,则在标号前加NEAR PTR,该说明符可以不写。对于位移量为8位短转移,则需在标号面前说明符SHORT。

JMP SHORT PROG_S ;段内短转移

JMP NEAR PTR PROG_N;段内近转移(或写成JMP PROG_N)

下面是一个含有无条件转移指令的简单程序的列表文件,它是由汇编语言源程序翻译后产生的。即:

;行号偏移量机器码程序

1 0000 CODE SEGMENT

2 ASSUME CS:CODE

3 0000 0405 PROG_S: ADD AL, 05H

4 0002 90 NOP

5 0003 EBFB JMP SHORT PROG_S

6 0005 90 NOP

7 0006 CODE ENDS

8 END\

程序共8行,最左边一列是程序的行号。整个程序只包含一个代码段,段名为CODE,它以CODE SEGMENT开头语句开头,以CODE ENDS语句结束。整个程序以END结束。行号后面的一列数字表示每条指令的首字节距离代码段基地址的偏移量(offset),偏移量后面的数字代表每条指令的机器码。标号为PROG_S的加法指令的偏移量为0,该指令站两个字节,所以下一条空操作指令(NOP)首字节的偏移量为2,NOP 指令除占用一个字节空间和用去3个时钟周期外,不作任何事情。

JMP SHORT PROG_S指令的首字节偏移量为3,当8086取出这条两字节的JMP指令后,首先增量地址指针,使IP=5,指向CPU原打算执行的第二条NOP指令。然而,JMP指令将改变程序执行的次序,它要转向目的地址PROG_S,而PROG_S的偏移量为0,所以JMP 指令中的位移量DISP位:

DISP=目的地址偏移量-IP当前值=0-5=-5,其补码为FBH,经符号扩展后成FFFBH,这样,

JMP指令将把IP修改为:IP=IP+DISP=0005+FFFB=0

于是程序就转到偏移量为0的位置,即标号PROG_S处执行

对于段内近转移指令,除了位移量可以是16位,和段内段转移指令一样,也采用相对寻址,在汇编格式中也是用符号地址(标号)。不过段内近转移指令占3个字节,由于计算位移量时,总是从紧跟JMP指令之后的下条地址开始计算,所以取出这类JMP指令之后,IP要先加3,再与目标地址量相加。对于位移量是16位的JMP指令,它可以转到段内任何地址去执行指令。

段内间接转移指令

这类指令转向的16位有效地址存放在一个16位寄存器或字存储单元中

用寄存器间接寻址的段内转移指令,要转向的有效地址存放在寄存器中,执行的操作是寄存器的内容送到IP中

JMP BX

若该指令执行前BX=4500H,则指令执行时,将当前IP修改成4500H,程序转到段内偏移地址为4500H处执行

对于用存储器间接寻址的段内转移指令,要转向的有效地址存放在存储单元中,所以JMP 指令先要计算存储单元的物理地址,再从该地址处取一个字送到IP 即,字存储单元的内容送到IP

JMP WORD PTR 5[BX]

设指令执行前,DS=2000H,BX=100H,(20105H)=4F0H,

则:指令执行后,IP=(20000H+100H+5H)=(20105H)=4F0H,即转到代码段内偏移地址为4F0H 处执行。

这种指令的目的操作数前加WORD PTR,表示进行的是字操作。

段间直接(远)转移指令

指令中用远标号直接给出了转向的段地址和偏移量,用指令中的段地址取代CS的内容,用指令中指定的段地址取代CS寄存器的内容,就可以是程序从一个代码段转到另一个代码段去执行。

例JMP FAR PTR PROG_F

指令中用说明符FAR PTR 说明PROG_F是远标号,指令执行的操作为,将远标号的段内偏移量送至IP中,将远标号所在段的段地址送到CS中。

设标号PROG_F所在段的基地址为=3500H,偏移地址=080AH,则,指令执行后,

IP=080AH,CS=3500,程序转到3500:080A处执行。

段间间接转移指令

将目的地址的段地址和偏移量事先放在存储器中的4个连续的地址单元中,其中,前两个字节为偏移量,后两个字节为段地址,转移指令中给出存放目标地址的存储单元的首字节地址值。这种指令的目的操作数前要加说明符DWORD PTR ,表示转向地址需取双字

JMP DWORD PTR[SI+0125H]

设指令执行前,CS=1200H,IP=05H,DS=2500H,SI=1300H,内存单元(26425H)=4500H,(26427H)=32F0H.而指令中的位移量DISP=0125H,其中高位部分为DISP_H=01H,低位部分DISP_L=25H

该指令占4个字节,第一个字节是操作码,编码为FFH,第2个字节的编码为:MOD 101 R\M,因该指令属于[SI]+D16这种形式,查表的MOD=10,R/M=100,第3和4个字节分别为

位移量的低字节和高字节

相关文档
最新文档