第3章6 控制转移指令 (2)_第1页
第3章6 控制转移指令 (2)_第2页
第3章6 控制转移指令 (2)_第3页
第3章6 控制转移指令 (2)_第4页
第3章6 控制转移指令 (2)_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、无条件转移指令JMP条件转移指令JZ/JNZ、JE/JNE、JS/JNS、JO/JNO、JP/JNP、JB/JNB、JL/JNL、JBE/JNBE、JLE/JNLE、JCXZ循环指令LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE子程序调用和返回指令CALL、RET中断与中断返回指令INT、INTO、IRET,3.3.5控制转移指令:,JMP(jmp)跳转指令无条件地转移到指令指定的地址去执行从该地址开始的指令。可以看出JMP指令必须指定转移的目标地址(或称转向地址)。总的说来,转移可以分成两类:段内转移和段间转移。段内转移是指在同一代码段的范围之内进行转移,此时只需改变IP寄存器

2、的内容,即用新的转移目标地址代替原有的IP的值就可达到转移的目的。段间转移则是要转到另一个代码段去执行程序,此时不仅要修改IP寄存器的内容,还需要修改CS寄存器的内容才能达到目的,因此,此时的转移目标地址应由新的段地址和偏移地址两部分组成。,3.3.5.1无条件转移指令,无条件转移指令的格式及执行的操作:段内直接短转移:JMPSHORTOPR(例)执行操作:(IP)(IP)+8位位移量段内直接近转移:JMPNEARPTROPR执行操作:(IP)(IP)+16位位移量段内间接转移:JMPWORDPTROPR执行操作:(IP)(EA),无条件转移指令,段间直接远转移:JMPFARPTROPR(例)

3、执行操作:(IP)OPR的段内偏移地址(CS)OPR所在段的段地址段间间接转移:JMPDWORDPTROPR执行操作:(IP)(EA)(CS)(EA+2)说明:JMP指令不影响条件标志位。,无条件转移指令,条件转移指令根据上一条指令所设置的条件码来判别测试条件,每一种条件转移指令有它的测试条件,满足测试条件则转移到由指令指出的转向地址去执行那里的程序;如不满足条件则顺序执行下一条指令。因此,当满足条件时:(IP)(IP)+符号扩展到16位后的位移量D8,如不满足测试条件:则(IP)不变。可见条件转移指令使用了相对寻址方式,在汇编格式中OPR应指定一个目标地址,这个目标地址应在本条转移指令下一条

4、指令地址的-128+127个字节的范围之内。即条件转移指令只能使用段内直接寻址的8位位移量(段内直接短转移)。另外,所有的条件转移指令都不影响条件码。,3.3.5.2条件转移指令,格式测试条件JZ(JE)OPRZF=1JNZ(JNE)OPRZF=0JSOPRSF=1JNSOPRSF=0JOOPROF=1JNOOPROF=0JPOPRPF=1JNPOPRPF=0JCOPRCF=1JNCOPRCF=0,(1)根据单个条件标志的设置情况转移,格式测试条件JB(JNAE,JC)OPRCF=1JNB(JAE,JNC)OPRCF=0JBE(JNA)OPRCFZF=1JNBE(JA)OPRCFZF=0*适用

5、于地址或双精度数低位字的比较,(2)比较两个无符号数,并根据比较结果转移*,格式测试条件JL(JNGE)OPRSFOF=1JNL(JGE)OPRSFOF=0JLE(JNG)OPR(SFOF)ZF=1JNLE(JG)OPR(SFOF)ZF=0*适用于带符号数的比较,(3)比较两个带符号数,并根据比较结果转移,格式测试条件JCXZOPR(CX)=0,(4)测试CX的值为0则转移,例:如果X50,转到TOO_HIGH;否则|X-Y|RESULT,如果溢出转到OVERFLOW,,JGJOJNS,MOVAX,XCMPAX,50TOO_HIGHSUBAX,YOVERFLOWNONNEGNEGAXNONNE

6、G:MOVRESULT,AXJMPEXITTOO_HIGH:JMPEXITOVERFLOW:EXIT:MOVAX,4C00HINT21H,例:、是双精度数,分别存于DX,AX及BX,CX中,时转X,否则转Y,CMPDX,BXJGXJLYCMPAX,CXJAXY:JMPEXITX:EXIT:MOVAX,4C00HINT21H,例3.94,课本p109,循环结构,用转移指令实现循环结构:MOVCX,NAGAIN:DECCXJNZAGAIN,LOOPOPRLOOPZ/LOOPEOPRLOOPNZ/LOOPNEOPR执行步骤:(1)(CX)(CX)-1(2)检查是否满足测试条件,如满足则(IP)(IP

7、)+8位位移量,实行循环;不满足则IP不变,退出循环。,循环指令:,循环指令,注意:*CX中存放循环次数*只能使用段内直接寻址的8位位移量*不影响条件标志位,循环指令:LOOPOPR测试条件:(CX)0为零或相等时循环指令:LOOPZ(LOOPE)OPR测试条件:ZF=1且(CX)0不为零或不相等时循环指令:LOOPNZ(LOOPNE)OPR测试条件:ZF=0且(CX)0,循环指令:,例:求首地址为ARRAY的M个字之和,结果存入TOTAL,MOVCX,MMOVAX,0MOVSI,AXAGAIN:ADDAX,ARRAYSIADDSI,2LOOPAGAINMOVTOTAL,AX,例:,MOVCX

8、,LMOVSI,-1MOVAL,20HNEXT:INCSICMPAL,ASCII_STRSILOOPNENEXTJNZNOT_FOUNDNOT_FOUND:,综合举例1:编写程序,实现两个数据块BLOCK1和BLOCK2相加,结果存入BLOCK2。DATASEGMENTBLOCK1DW100DUP(?)BLOCK2DW100DUP(?)DATAENDS;-CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AX;initializethedatasegmentMOVES,AX;initializetheextrasegme

9、ntCLD;DF=0forautoincrementMOVCX,100;loadthecounterMOVSI,OFFSETBLOCK1;addressofblock1MOVDI,OFFSETBLOCK2;addressofblock2NEXT:LODSW;loadthedataofblock1intoAXADDAX,ES:DI;addthedataofblock2toAXSTOSW;storethesumtoblock2LOOPNEXT;repeat100timesMOVAX,4C00H;returntoDOSINT21HCODEENDSENDSTART,综合举例2,编写程序:(1)用STO

10、S指令将0AAH存入100个存储器字节;(2)利用LODS指令测试这些存储器单元的内容是否是0AAH,如果不是则显示badmemory。,DTSEGSEGMENTDATAMDB100DUP(?)MESGDBbadmemory,$DTSEGENDSCDSEGSEGMENTASSUMECS:CDSEG,DS:DTSEG,ES:DTSEGSTART:MOVAX,DTSEG;initializeMOVDS,AX;DSregisterMOVES,AX;andESregisterCLD;clearDFforincrementMOVCX,50;loadthecounter(50words)MOVDI,OFF

11、SETDATAM;loadthepointerfordestinationMOVAX,0AAAAH;loadthepatternREPSTOSW;repeatuntilCX=0;bringinthepatternandtestitonebyoneMOVSI,OFFSETDATAM;loadthepointerforsourceMOVCX,100;loadthecounter(100bytes)AGAIN:LODSB;loadintoALfromDS:SIXORAL,0AAH;ispatternthesame?JNZOVER;ifnotthesame,thenexitLOOPAGAIN;cont

12、inueuntilCX=0JMPEXIT;exitprogramOVER:MOVAH,09;displayMOVDX,OFFSETMESG;themessageINT21H;routineEXIT:MOVAX,4C00H;returntoDOSINT21HCDSEGENDSENDSTART,综合举例3,假设有人将电子字典中的LABEL误拼为LABLE,编写程序比较这两个词,并根据比较结果显示(1)如果相同,则显示Thespellingiscorrect;(2)如果不同,则显示Wrongspelling。,DATASEGSEGMENTDAT_DICTDBLABELDAT_TYPEDBLABLEM

13、ESS1DBThespellingiscorrect,$MESS2DBWrongspelling,$DATASEGENDS;-CODESEGSEGMENTASSUMECS:CODESEG,DS:DATASEG,ES:DATASEGSTART:MOVAX,DATASEGMOVDS,AX;initializethedatasegmentMOVES,AX;initializetheextrasegmentCLD;DF=0forautoincrementMOVSI,OFFSETDAT_DICT;SIissourcepointerMOVDI,OFFSETDAT_TYPE;DIisdestinationp

14、ointerMOVCX,05;loadthecounterREPECMPSB;repeataslongasequaloruntilCX=0JEOVER;ifZF=1thendisplaymess1MOVDX,OFFSETMESS2;ifZF=0thendisplaymess2JMPDISPOVER:MOVDX,OFFSETMESS1DISP:MOVAH,09;displaymessageINT21HMOVAX,4C00H;returntoDOSINT21HCODSEGENDSENDSTART,子程序结构相当于高级语言中的过程(procedure)。为便于模块化程序设计,往往把程序中某些具有独立

15、功能的部分编写成独立的程序模块,称之为子程序。程序中可由调用程序(或称主程序)调用这些子程序,而在子程序执行完后又返回调用程序继续执行。主程序调用子程序时使用CALL指令,由子程序返回主程序时使用RET指令。由于调用程序和子程序可以在同一个代码段中,也可以在不同的代码段中,因此,CALL指令和RET指令也有近调用、近返回及远调用、远返回两类格式。,3.3.5.5子程序,主程序与子程序,CALLlabel,主程序,RET,子程序,回到CALL指令后的指令处返回地址,code1segmentmainprocfarcallfarptrsubpretmainendpcode1endscode2segm

16、entsubpprocfarretsubpendpcode2ends,段间调用和返回,codesegmentmainprocfarcallsubpretmainendpsubpprocnearretsubpendpcodeends,段内调用和返回,子程序调用和返回指令:,(1)段内直接近调用:CALLDST执行操作:(SP)(SP)-2(SP)+1,(SP)(IP)(IP)(IP)+16位位移量(2)段内间接近调用:CALLDST执行操作:(SP)(SP)-2(SP)+1,(SP)(IP)(IP)(EA)其中EA是由DST的寻址方式所确定的有效地址。,1、CALL调用指令,(3)段间直接远调用

17、:CALLDST执行操作:(SP)(SP)-2(SP)+1,(SP)(CS)(SP)(SP)-2(SP)+1,(SP)(IP)(IP)偏移地址(CS)段地址(4)段间间接远调用:CALLDST执行操作:(SP)(SP)-2(SP)+1,(SP)(CS)(SP)(SP)-2(SP)+1,(SP)(IP)(IP)(EA)(CS)(EA+2),1、CALL调用指令,(1)段内近返回:RET执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2(2)段内带立即数近返回:RETEXP执行的操作:(IP)(SP)+1,(SP)(SP)(SP)+2(SP)(SP)+D16,2、RET返回指令,(3)段

18、间远返回:RET执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2(CS)(SP)+1,(SP)(SP)(SP)+2(4)段间带立即数远返回:RETEXP执行操作:(IP)(SP)+1,(SP)(SP)(SP)+2(CS)(SP)+1,(SP)(SP)(SP)+2(SP)(SP)+D16CALL指令和RET指令都不影响条件码。,2、RET返回指令,有时当系统运行或者程序运行期间在遇到某些特殊情况时,需要计算机自动执行一组专门的例行程序来进行处理。这种情况称为中断(Interrupt),所执行的这组程序称为中断例行程序(Interruptroutine)或中断子程序。中断分为内部中断和

19、外部中断两类。内部中断(软件中断)包括象除法运算中遇到需要除以0时所产生的中断,或者程序中为了作某些处理而设置的中断指令等。外部中断(硬件中断)则主要处理I/O设备与CPU之间的通信。当CPU响应一次中断时,也要和调用子程序时类似地把(IP)和(CS)保存入栈。除此之外,为了能全面地保存现场信息,以便在中断处理结束时返回现场,还需要把反映现场状态的(PSW)保存入栈,然后才能转到中断例行程序去执行。当然从中断返回时,除要恢复(IP)和(CS)外,还需要恢复(PSW)。,3.3.5.6中断,主程序,IRET,中断服务程序,断点,中断请求,中断请求可以来自处理器外部的中断源,也可以由处理器执行指令

20、引起:例如执行INTi8指令。,中断的过程,中断例行程序的入口地址称为中断向量。在IBMPC机中,存储器的最低地址区的1024个字节(地址从00000H到003FFH)为中断向量区,其中存放着256种类型中断例行程序的入口地址(中断向量)。由于每个中断向量占有4个字节单元,所以中断指令中指定的类型号N需要自乘以4才能取得所指定类型的中断向量,例如如果类型号为9,则与其相应的中断向量存放在00024-00027单元中。IBM_PC机为每个类型规定了一定的功能,例如类型0为除以0时的中断例行程序入口,类型3为设置断点时的中断例行程序入口,类型4为溢出处理的中断例行程序入口,类型10为显示设备的中断

21、例行程序入口,类型20为程序结束的中断例行程序入口,类型21为系统功能调用的中断例行程序入口等。除非特别注明,类型号是以十六进制数形式表示的。,类型0的(IP),类型0的(CS),类型1的(IP),类型1的(CS),类型N的(IP),类型N的(CS),类型255的(IP),类型255的(CS),00000,00004,4*N,003FC,中断向量表,INTTYPE或INT执行操作:(SP)(SP)-2(SP)+1,(SP)(FLAGS)(SP)(SP)-2(SP)+1,(SP)(CS)(SP)(SP)-2(SP)+1,(SP)(IP)(IP)(TYPE*4)(CS)(TYPE*4+2)INT指令设置IF和TF标志为0,不影响其它标志位*TYPE(0255)是中断类型号,隐含的类型号为3,(1)中断指令:,执行操作:若OF=1,(SP)(SP)-2(SP)+1,(SP)(FLAGS)(SP)(SP)-2(SP)+1,(SP)(CS)(SP)(SP)-2(SP)+1,(SP)(IP)(IP)(10H)(CS)(12H)INTO指令设置IF和TF标志为0,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论