324 转移指令-精品文档资料系列.ppt
3.2.4 3.2.4 控制转移类指令控制转移类指令l控制转移类指令控制转移类指令用于实现分支、循环、过用于实现分支、循环、过程等程序结构,是仅次于传送程等程序结构,是仅次于传送指令的最常指令的最常用指令用指令重点掌握:JMP/Jcc/LOOP CALL/RET INT n/IRET一般了解:LOOPZ/LOOPNZ INTO 控控制制转转移移类类指指令令通通过过改改变变IP(和和CS)值值,实现程序执行顺序的改变实现程序执行顺序的改变1.目标地址的寻址方式目标地址的寻址方式l直接寻址方式直接寻址方式l转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式l间接寻址方式间接寻址方式l转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式用标号表达用标号表达用寄存器或存储器用寄存器或存储器操作数表达操作数表达目标地址的范围:段内目标地址的范围:段内l段内转移段内转移近转移(近转移(near)l在当前代码段64KB范围内转移(32KB范围)l不需要更改CS段地址,只要改变IP偏移地址l段内转移段内转移短转移(短转移(short)l转移范围可以用一个字节表达,在段内128127范围的转移代代码码段段代代码码段段目标地址的范围:段间目标地址的范围:段间l段间转移段间转移远转移(远转移(far)l从当前代码段跳转到另一个代码段,可以在1MB范围l需要更改CS段地址和IP偏移地址l目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址代代码码段段代代码码段段 实实际际编编程程时时,汇汇编编程程序序会会根根据据目目标标地地址址的的距离,距离,自动处理自动处理成短转移、近转移或远转移成短转移、近转移或远转移 程程序序员员可可用用操操作作符符short、near ptr 或或far ptr 强制强制jmp again;转向;转向again处继续执行处继续执行again:dec cx;标号;标号again的指令的指令jmp output;转向;转向outputoutput:mov result,al;标号;标号output的指令的指令JMP 0120H;直接转向;直接转向CS:0120H:0120H单元单元2.无条件转移指令无条件转移指令JMP段内转移、直接寻址段内转移、直接寻址JMP label;IPIP+IPIP+位移量位移量l位移量是紧接着位移量是紧接着JMP指令后的那条指令的偏移地址指令后的那条指令的偏移地址到目标指令的偏移地址的地址位移到目标指令的偏移地址的地址位移l当向地址增大方向转移时,位移量为正;向地址减当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负小方向转移时,位移量为负 jmp again;转向转向again处继续执行处继续执行again:dec cx;标号;标号again的指令的指令jmp output;转向;转向outputoutput:mov bl,al;标号;标号output的指令的指令jmp 0120H;直接转向直接转向CS:0120H单元单元实际为相对寻址实际为相对寻址JMP指令:段内相对转移指令:段内相对转移段内转移、间接寻址段内转移、间接寻址 JMP r16/mem16;IPr16/m16l将一个将一个16位寄存器或主存字单元内容送入位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改寄存器,作为新的指令指针,但不修改CS寄寄存器的内容存器的内容jmp ax;IPAXjmp word ptr 2000H ;IP2000HJMP指令:段内寄存器间接转移指令:段内寄存器间接转移段间转移、直接寻址段间转移、直接寻址JMP far ptr label;IP label 的偏移地址的偏移地址;CSlabel 的段地址的段地址l将标号所在段的段地址作为新的将标号所在段的段地址作为新的CS值,标值,标号在该段内的偏移地址作为新的号在该段内的偏移地址作为新的IP值;这样,值;这样,程序跳转到新的代码段执行程序跳转到新的代码段执行jmp far ptr otherseg;远转移到代码段;远转移到代码段2的的othersegJMP指令:段间直接转移指令:段间直接转移段间转移、间接寻址段间转移、间接寻址JMP far ptr mem ;IPmem,CSmem+2l用一个双字存储单元表示要跳转的目标地址。这个用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位目标地址存放在主存中连续的两个字单元中的,低位字送字送IP寄存器,高位字送寄存器,高位字送CS寄存器。寄存器。mov word ptr bx,0mov word ptr bx+2,1500HJMP far ptr bx ;转移到;转移到1500H:0JMP指令:段间间接转移指令:段间间接转移3.条件转移指令条件转移指令格式:格式:Jcc label label:;条件满足,跳转;条件满足,跳转标号标号label指定的目标地指定的目标地址去执行指令址去执行指令 ;条件不满足,顺序执行;条件不满足,顺序执行下一条指令下一条指令 ;操作数操作数label是采用短转移,称为相对寻址方式是采用短转移,称为相对寻址方式相对寻址方式相对寻址方式lJcc指令的操作数指令的操作数label是一个标号是一个标号l一个8位位移量,表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移l8位位移量是相对于当前IP的,且距当前IP地址128127个单元的范围之内,属于段内短距离转移lJcc指令为指令为2个字节,条件不满足时的顺序执个字节,条件不满足时的顺序执行就是当前指令偏移指针行就是当前指令偏移指针IP加加2Jcc指令的分类指令的分类lJcc指令不影响标志,但要利用标志位。指令不影响标志,但要利用标志位。根据利用的标志位不同,根据利用的标志位不同,16条指令分条指令分成成3种情况:种情况:(1)判断单个标志位状态(2)比较无符号数高低(3)比较有符号数大小(1)判断单个标志位状态)判断单个标志位状态l这组指令单独判断这组指令单独判断5个状态标志之一个状态标志之一JZ和和JNZ:判断结果是否为零(或相等)判断结果是否为零(或相等)JS和和JNS:判断结果是正是负判断结果是正是负JO和和JNO:判断结果是否产生溢出判断结果是否产生溢出JP和和JNP:判断结果中判断结果中“1”的个数是偶是奇的个数是偶是奇JC和和JNC:判断结果是否进位或借位判断结果是否进位或借位例:JZ/JNZ指令test al,80h;测试;测试AL的最高位的最高位jz next1;D70(ZF1),转移),转移mov ah,0ffh;D71,顺序执行,顺序执行jmp done;无条件转向;无条件转向next1:mov ah,0done:.test al,80h ;测试最高位;测试最高位jnz next2 ;D71(ZF0),转移),转移mov ah,0 ;D70,顺序执行,顺序执行jmp done ;无条件转向;无条件转向next2:mov ah,0ffhdone:.例:例:JC/JNC CMP AX,BX JC NEXT MOV AX,BXNEXT:MOV MIN,AX例:JS/JNS指令;计算;计算|XY|(绝对值)(绝对值);X和和Y为存放于为存放于X单元和单元和Y单元的单元的16位操作数位操作数;结果存入;结果存入result单元单元mov ax,Xsub ax,Yjns nextneg ax ;neg是求补指令:是求补指令:0axnext:mov result,ax例:例:JO/JNO指令指令;计算;计算XY;X和和Y为存放于为存放于X单元和单元和Y单元的字操作数单元的字操作数;若溢出,则转移到;若溢出,则转移到overflow处理处理 mov ax,X sub ax,Y jo overflow .;无溢出,结果正确;无溢出,结果正确overflow:.;有溢出,出错处理有溢出,出错处理例:JP/JNP指令;设字符的设字符的ASCII码在码在AL寄存器中寄存器中;将字符加上奇校验位;将字符加上奇校验位and al,7fh;最高位先置最高位先置“0”,并判断,并判断“1”的的个数个数jnp next;个数已为奇数,则转向个数已为奇数,则转向nextor al,80h;否则,最高位置否则,最高位置“1”next:.(2)比较两数)比较两数Jcc M,NM N无符号数无符号数(A,B)有符号数有符号数(G,L)l=)JB(JNAE)JL(JNGE)l)JBE(JNA)JLE(JNG)l(=(50,转到,转到TOO_HIGH,否则,否则 计算计算X-Y:溢出转到溢出转到OVERFLOW,否则否则|X-Y|RESULT MOV AX,XCMP AX,50JG TOO_HIGHSUB AX,YJO OVERFLOWJNS NONNEGNEG AX NONNEG:MOV RESULT,AX TOO_HIGH:OVERFLOW:【例】复制数据块【例】复制数据块AREA1AREA2目目的的数数据据块块数数据据段段.AREA1+1AREA2+1.AREA1+99AREA2+99.SI=2000HINCSISI=2001H(AREA1)=34HINCAREA1INC2000H(AREA1)=35H1000H:2000H34H【例】等价程序【例】等价程序LEA SI,AREA1LEA DI,AREA2MOV CX,100AGAIN:MOV AL,SI MOV DI ,ALINC SIINC DIDEC CXJNE AGAIN赋初值循环体【例】另一种做法【例】另一种做法MOV SI,0MOV DI,0MOV CX,100AGAIN:MOV AL,AREA1SIMOV AREA2DI,ALINCSIINCDIDEC CXJNZ AGAIN赋初值循环AREA1AREA2.AREA1+1AREA2+1.AREA1+99AREA2+99.SIDISI=2000HSI AREA10INCSISI=2001HSI AREA114.循环指令循环指令 LOOP格式:格式:LOOP LOOP label操作:操作:(CX)-1CX(CX)-1CX;若若(CX)0,(CX)0,则转至则转至label处执行;处执行;否则退出循环否则退出循环,执行执行LOOPLOOP后面的指令。后面的指令。LOOP指令与下面的指令段等价:指令与下面的指令段等价:DEC CX JNZ label例:记录字符串中空格的个数;String是附加段中的一个字符串是附加段中的一个字符串mov cx,count;设置循环次数;设置循环次数lea si,stringxor bx,bx;bx0,记录空格数,记录空格数mov al,20h;空格的;空格的ASCII码为码为20Hagain:cmp al,es:sijnz next;ZF0非空格,转移非空格,转移inc bx;ZF=1是空格,个数加是空格,个数加1next:inc siloop again ;字符个数减;字符个数减1,不为,不为0继续循环继续循环dec cxjnz againl应用举例:将数据段应用举例:将数据段1000H1000H开始的开始的100100个存储个存储单元全部填充为单元全部填充为ASCIIASCII码码2AH(*)2AH(*)。MOV DI,1000H MOV CX,64H;循环计数器;循环计数器MOV AL,2AHAGAIN:MOV DI,AL INC DI DEC CX JNZ AGAINHLT上程序段存放在上程序段存放在代码段代码段中中,設設(CS)=109EH,则各条指令存放地址如下:则各条指令存放地址如下:CS :IP 指令指令109E:0100 MOV DI,1000H109E:0103 MOV CX,64H109E:0106 MOV AL,2AH109E:0108 MOV DI,AL109E:010A INC DI109E:010B DEC CX109E:010C JNZ 0108109E:010E HLT109E:0110 写入写入2AH(*)2AH(*)后,数据段中相应存储单元的内容改后,数据段中相应存储单元的内容改变如下:变如下:DS:1000DS:1000 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1010DS:1010 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1020DS:1020 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1030DS:1030 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1040DS:1040 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1050DS:1050 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1060DS:1060 2A 2A 2A 2A 2A 2A 2A 2A相等或为零循环指令相等或为零循环指令格式:格式:LOOPE/LOOPZ LOOPE/LOOPZ label操作:操作:(CX)-1CX(CX)-1CX;若若(CX)0(CX)0且且ZF=1,ZF=1,则转至则转至labellabel处执行;处执行;否则退出循环否则退出循环,执行执行LOOPLOOP后面的指令。后面的指令。不等或不为零循环指令不等或不为零循环指令格式:格式:LOOPLOOPN NE/LOOPE/LOOPN NZ labelZ label操作:操作:(CX)-1CX(CX)-1CX;若若(CX)0(CX)0且且ZF=ZF=0 0,则转至则转至labellabel处执行;否则处执行;否则退出循环退出循环,执行执行LOOPLOOP后面的指令。后面的指令。5.主程序与子程序主程序与子程序CALL label主程序主程序RET子程序子程序回到回到CALL指令后的指令处指令后的指令处返回地址返回地址子程序调用指令子程序调用指令 CALLlCALL指令分成指令分成4种类型(类似种类型(类似JMP)CALL label;段内调用、直接寻址CALL r16/m16;段内调用、间接寻址CALL far ptr label;段间调用、直接寻址CALL far ptr mem;段间调用、间接寻址子程序调用指令子程序调用指令 CALLlCALL指令需要保存返回地址:指令需要保存返回地址:l段内调用段内调用偏移地址偏移地址IP入栈入栈SPSP2,SS:SPIPl段间调用段间调用入栈偏移地址入栈偏移地址IP和段地址和段地址CSSPSP2,SS:SPCSSPSP2,SS:SPIP子程序返回指令子程序返回指令 RET段间返回指令RET的操作为:IP(SP)+1,(SP)SP(SP)+2;栈顶内容弹出到IP CS(SP)+1,(SP)SP(SP)+2;栈顶内容弹出到CS段内段内返回指令返回指令RET的操作为:的操作为:IP(SP)+1,(SP)SP(SP)+2;栈顶内容弹出到栈顶内容弹出到IP返回指令返回指令RET的参数的参数RET i16;有参数返回;有参数返回lRET指令可以带有一个立即数指令可以带有一个立即数i16,则堆栈指针则堆栈指针SP将增加,即将增加,即SPSP+i16l这个特点使得程序可以方便地废除若干这个特点使得程序可以方便地废除若干执行执行CALL指令以前入栈的参数指令以前入栈的参数6.中断指令中断指令l中断(中断(Interrupt)是一种改变程序执行顺序的)是一种改变程序执行顺序的方法方法l中断具有多种中断类型中断具有多种中断类型l中断的指令有中断的指令有3条:条:INT n IRET INTO中断的过程中断的过程主程序主程序IRET中断服务程序中断服务程序断点断点中断请求中断请求 INT n中断请求可以来自处理器外部的中断源,中断请求可以来自处理器外部的中断源,也可以由处理器执行指令引起:也可以由处理器执行指令引起:例如执行例如执行INT n指令。指令。8086的外部中断的外部中断l8086可以管理可以管理256个中断个中断l各种中断用一个向量编号来区别各种中断用一个向量编号来区别l主要分成外部中断和内部中断主要分成外部中断和内部中断l外部中断外部中断来自来自CPU之外的原因引起的中断,之外的原因引起的中断,又可以分成又可以分成l可屏蔽中断:可由CPU的IF位控制l非屏蔽中断:不受IF控制8086的内部中断的内部中断l内部中断内部中断CPU执行程序引起的中断,又可执行程序引起的中断,又可分成:分成:l除法错中断:执行除法指令,结果溢出产生的 0 号中断l指令中断:执行中断调用指令INT i8产生的 i8 号中断l断点中断:用于断点调试(INT 3)的 3 号中断l溢出中断:执行溢出中断指令,OF1产生的 4 号中断l单步中断:TF1在每条指令执行后产生的 1 号中断本指令的操作步骤为:本指令的操作步骤为:(SP)-1,(SP)-2)(SP)-1,(SP)-2)(FLAGSFLAGS),SP(SP)-2SP(SP)-2 保护标志寄存器的内容保护标志寄存器的内容IF0,TF0IF0,TF0 中断服务程序中禁止外部中断服务程序中禁止外部INTRINTR中断和单步中断中断和单步中断(SP)-1,(SP)-2)(SP)-1,(SP)-2)(CSCS),SP(SP)-2SP(SP)-2,CS(nCS(n4+2)4+2)中断服务程序的段地址送入中断服务程序的段地址送入CSCS。n n4 4为向量地址。为向量地址。该向量地址中的内容即为中断服务程序入口地址。该向量地址中的内容即为中断服务程序入口地址。(SP)-1,(SP)-2)(SP)-1,(SP)-2)(IPIP),SP(SP)-2SP(SP)-2,IP(nIP(n4)4)中断服务程序的偏移地址送中断服务程序的偏移地址送IPIP。(1)INT n ;n=0(1)INT n ;n=0255,255,为中断类型号为中断类型号INTO检查溢出标志检查溢出标志OF,如果如果OF=1,=1,则启动一个则启动一个类型类型4 4的中断过程;如果的中断过程;如果OF=0,=0,不做任何操作。不做任何操作。通通常常INTO指指令令安安排排在在有有符符号号数数算算术术运运算算指指令令后面。如后面。如ADD AX,67INTO;若若溢溢出出,则则启启动动溢溢出出中中断断处处理理 MOV RESULT,AX;未溢出,则继续;未溢出,则继续 (2)(2)溢出中断溢出中断INTOINTO用于从中断服务程序返回被中断的程序。用于从中断服务程序返回被中断的程序。任何中断服务程序不管是外部中断引起的任何中断服务程序不管是外部中断引起的,还还是内部中断引起的是内部中断引起的,最后都要用最后都要用IRETIRET返回。返回。该指令执行的操作为:该指令执行的操作为:IP(SP)+1,(SP);IP(SP)+1,(SP);栈顶内容弹出到栈顶内容弹出到IPIP SP(SP)+2 SP(SP)+2 CS(SP)+1,(SP);CS(SP)+1,(SP);栈顶内容弹出到栈顶内容弹出到CSCS SP(SP)+2 SP(SP)+2 FLAGS(SP)+1,(SP);FLAGS(SP)+1,(SP);栈顶内容弹出到栈顶内容弹出到FLAGFLAG SP(SP)+2 SP(SP)+2(3)(3)中断返回指令中断返回指令IRETIRET3.2.5 3.2.5 处理器控制指令处理器控制指令1.1.标志操作指令标志操作指令 用来设置标志位的状态。用来设置标志位的状态。(1 1)CFCF设置指令设置指令 CLC 0CF0CF STC 1CF1CF CMC CFCF变反变反 (2 2)IFIF设置指令设置指令CLI 0IF(0IF(禁止禁止INTRINTR中断中断)STI 1IF(1IF(开放开放INTRINTR中断中断)(3 3)DFDF设置指令设置指令 CLD 0DF(0DF(串操作的指针移动方向从低到高串操作的指针移动方向从低到高)STD 1DF(1DF(串操作的指针移动方向从高到低串操作的指针移动方向从高到低)HLT;进入暂停状态;进入暂停状态l暂停指令使暂停指令使CPU进入暂停状态,这时进入暂停状态,这时CPU不进行任何不进行任何操作。当操作。当CPU发生复位或来自外部的中断时,发生复位或来自外部的中断时,CPU脱脱离暂停状态离暂停状态lHLT指令可用于程序中等待中断。当程序中必须等待指令可用于程序中等待中断。当程序中必须等待中断时,可用中断时,可用HLT,而不必用软件死循环。然后,中断,而不必用软件死循环。然后,中断使使CPU脱离暂停状态,返回执行脱离暂停状态,返回执行HLT的下一条指令的下一条指令lHLTHLT不影响标志位。不影响标志位。2.2.外部同步指令外部同步指令(1)暂停指令暂停指令 HLT(2)(2)空操作指令空操作指令NOPNOPl不执行任何操作,但占用一个字节存储不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期单元,空耗一个指令执行周期,然后执行然后执行下一条指令。下一条指令。lNOP常用于程序调试常用于程序调试l在需要预留指令空间时用NOP填充(占位子)l代码空间多余时也可以用NOP填充l还可以用NOP实现软件延时(3)(3)等待指令等待指令WAITWAITWAIT;进入等待状态;进入等待状态l8086利用利用WAIT指令和测试引脚实现与指令和测试引脚实现与8087同步运行同步运行l浮点指令经由浮点指令经由8086处理发往处理发往8087,并,并与与8086本身的整数指令在同一个指令本身的整数指令在同一个指令序列;而序列;而8087执行浮点指令较慢,所执行浮点指令较慢,所以以8086必须与必须与8087保持同步保持同步