《第5章 程序控制指 中断.ppt》由会员分享,可在线阅读,更多相关《第5章 程序控制指 中断.ppt(77页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第5章程序控制指令程序控制指令程序控制指令控制程序流向。程序控制指令包括:转移、循环、调用、返回、中断。无条件转移(JMP),允许程序转移到存储器的任何地址执行下一条指令。条件转移Jnnn则是根据对标志寄存器数据的测试(TEST)或比较(CMP)来决定转移的地址。5.1程序控制:JMP,loop,Call,无条件转移指令JMPJMPSHORTaddressJMPNEARPTRaddressJMPaddressJMPFARPTRADDRESS条件转移指令Jnnn短地址循环指令LOOP条件循环指令LOOPnnnn*比较指令CMP5.2调用过程:Call与RET5.3中断服务中断中断向量表INT指令
2、与执行IRET指令与执行指令标号JMP的操作数的操作数,Jnnn(条件转移条件转移),和LOOP指令,由另一条指令的标号决定。例:JMPP50P50:INCCX指令的标号是近属性指令的标号是近属性,在同一个代码段内,标号在过程之中。(指令标号)可以在单独的一行写标号可以在单独的一行写标号P50:INCCX两种情况下,P50的地址都与INC指令的第一个字节相关联。无条件转移指令无条件转移指令JMPJMP指令是无条件的,在所有情况下都会转移,允许程序允许程序转移转移到存储器的任何到存储器的任何地址执行下一条指令。地址执行下一条指令。不影响操作位不影响操作位。操作操作:(IP)(IP)+位移值位移值
3、(CS)目标段的目标段的(CS)短,近和远地址汇编程序支持三种类型的地址,是根据它们与当前地址的距离当前地址的距离加以区别的。(无条件转移指令JMP)格式格式:标号标号:JMP 短短,近近,或者远地址或者远地址 标号标号/寄存器寄存器/内存内存(短,近和远地址)1)短地址:对距离的限制是128 到到 127(27)字节字节.1-字节字节 偏移偏移2)近地址近地址:对距离的限制是32768 到到 32767(215)字节.2-字节偏移字节偏移,在同一段内在同一段内3)远地址:同一段内,距离可以超过32K(215)或者在其或者在其他段内他段内。段:偏移。段:偏移。实模式下:JMPSHORTaddr
4、ess;地址是8位的位移量JMPNEARPTRaddress;地址是16位的位移量JMPaddress;地址是8/16位的位移量)JMPFARPTRADDRESS;地址是32位的位移量(无条件转移指令JMP)短EB8位位移近E9低8位高8位远EAIP低IP高CS低CS高无条件转移指令JMP短短/近近/远地址远地址短转移短转移格式格式:JMP 短地址短地址JMP 地址地址;地址是8位的位移量;short 是虚拟操作符是虚拟操作符,它迫使CPU做短转移操作操作:(IP)(IP)+8位位移量位位移量(短转移)因为短转移的是相对转移,因此,短转移可以重定位。如果代码段移动到新的位置,然而JMP到标号的
5、距离并没有改变,所以只需移动代码段来进行重定位。用JMP指令(短,近)例:000033BDXORBX,BX0002D80001START:MOVAX,10009(IP)000503C3ADDAX,BX+0017(shift)0007EB17JMPSHORTNEXT0020(T.A.)00208BD8NEXT:MOVBX,AX0024(IP)0022EBDEJMPSTART+FFDE(shift)(1)0002(T.A.)(短转移)近转移格式格式:JMP NEAR PTR address;标号JMP在在JMP后面后面,地址是16位的位移量;NEARPTR是虚拟操作符,强迫CPU进行近转移JMP
6、address;标号在JMP之后之后,地址是16位位移量操作操作:(IP)(IP)+16位位移量(近转移)超过了-128到+127字节的JMP就变成了近转移(32k范围内),对于近转移,汇编程序产生不同的机器码(E9)和两个字节的操作数。能够重定位。3 35(近转移)例例 8-2:XOR BX,BX START:MOV AX,1 ADD AX,BX JMP NEAR PTR NEXT NEXT:MOV BX,AX JMP START远转移远转移JMP FAR PTR ADDRESS;地址是32 位位移量位位移量(地址);FARPTR是虚拟操作符,强迫CPU远转移超过超过32KB 字节字节(实模
7、式实模式的内存系统统)JMP就变成了远转移远转移(从一个段到另一个段从一个段到另一个段).(远转移)1)JMPFARPTRADDRA3129;ADDR是32位的地址A3128;FARPTR是远转移虚拟操作符A3127例:4字节的操作数代替CS和IP的内容内存TohereA3000127JMP1000410003100021000110000(远转移)2)如果为远转移定义一个标号作为远标号,远标号在当前代码段或者过程之外。标号在当前代码段或者过程之外。例:EXTERNUP:FAR;定义UP作为远标号(远转移)3)使用双冒号使用双冒号(:)来定义一个远标号来定义一个远标号.例:EXTRN UP:F
8、AR ;定义UP作为远标号START:MOVAX,1;定义START作为标号JMPFARPTRSTART;远转移JMP UP;远转移寄存器间接转移寄存器间接转移寄存器间接转移,用16 位位 或或 32位的寄存器位的寄存器作为操作数作为操作数,转移地址在寄存器内。转移地址在寄存器内。注意:寄存器间接转移指令间接转移指令直接传送寄存器直接传送寄存器内容到指令指针寄存器中内容到指令指针寄存器中(IP).例:JMPAX;复制AX寄存器的内容到IP中内存间接转移转移的目标地址转移的目标地址,存储在数据段内存单元中在数据段内存单元中。例:JMP TABLESI转移指令用格式来访问转移目标地址,这包含了近地
9、址间接转移间接转移 或者或者段地址和偏移地址的远地址的间接转移。远地址的间接转移。除非用FARPTR指明远转移指令,否则汇编程序默认是近转移。条件转移指令条件转移指令处理器支持各种条件转移指令这些指令的操作由标志寄存器的位设置所决定标志寄存器的位设置所决定。格式格式:标号标号:Jnnn 短地址短地址 例:DECCXJNZA20(条件转移指令)对于对于8086286 的的JMP 和和LOOP,条条件转移件转移必须是必须是短距离的短距离的,在,在128 到到+127 字节内字节内.80386和更新的处理器允许在任何32K(=215)内的地址转移。有符号和无符号数据无符号的数据项(逻辑数据)把所有的
10、位作为数据位。例如用户编号和电话号码。有符号的数据项(算术数据)把最左边的位当做符号来处理,其中0为正而1为负。例如距离和数量,可以是正,也可以是负。UnsigneddatasigneddataDistinguishsequencebetweenunsignedandsigneddata(有符号和无符号数据)例:假定(CX)=11000110,(DX)=00010110CMPCX,DX当成无符号数据,(CX)比较大;当成有符号数据,(DX)比较大;无符号(逻辑)数据的转移无符号(逻辑)数据的转移符号符号 说明说明测试测试标志标志JE/JZ相等则转移或为零则转移Z=1JNE/JNZ 不相等则转移
11、或不为零则转移Z=0JA/JNBE 高于则转移或不低于/等于则转移C=0&Z=0JAE/JNB 高于/等于则转移或不低于则转移C=0JB/JNAE 低于则转移或不高于/等于则转移C=1JBE/JNA 低于/等于则转移或不高于则转移C=1orZ=1这些条件转移中的每一个都可以用两个符号操作中的一个来表示,应该选择比较清楚或比较能说明问题的那一个。有符号(算术)数据的转移有符号(算术)数据的转移符号符号 说明说明测试测试标志标志JE/JZ相等或为零则转移Z=1JNE/JNZ 不相等或不为零则转移Z=0JG/JNLE 大于则转移或不小于/等于则转移S=0&Z=0JGE/JNL 大于/等于则转移或不小
12、于则转移S=0JL/JNGE 小于则转移或不大于/等于则转移S=1JLE/JNG 小于/等于则转移或不大于则转移S=1orZ=1JE/JZ 和和JNE/JNZ的转移在无符号与有符号数据的的转移在无符号与有符号数据的两个表中都有,两个表中都有,这是因为条件的存在于有没有符号无关。专用的算术运算测试符号符号 说明说明测试标志测试标志JCXZ若若CX=0则转移则转移noneJC进位为1则转移(C=1)C=1JNC进位为0则转移(C=0)C=0JO溢出则转移O=1JNO不溢出则转移O=0LP/LPE奇偶位为1/奇偶位为偶则转移P=1JNP/JPO奇偶位为0/奇偶位为奇则转移P=0JS符号位为1(负)则
13、转移S=1JNS符号位为0(正)则转移S=0专用的算术运算测试JCXZ 测试CX的内容是否为零,不影响也不测不影响也不测试试标志位.有符号有符号数据的转移是相等,大于相等,大于,或,或 小于小于无符号无符号数据的转移是相等,高于,或相等,高于,或 低于低于。loop指令指令格式格式:标号标号:LOOP 短地址短地址 (CX)0时,一直时,一直循环循环。(loop指令)loop指令循环指定的次数循环指定的次数或或者 循环循环直到满足指定的条件为止直到满足指定的条件为止,要求在在CX中有一个初始值中有一个初始值。(loop指令)对于每次迭代,LOOP自动从CX中减1.(CX)=(CX)-1一旦CX
14、达到零,转到下一条指令。如果CX是非零,则转移到操作数的地址。(loop指令)CX=循环次数循环次数(CX)=(CX)-1(CX)=0?运行loop程序(跳到短地址)NY下条指令(loop指令)loop指令指令 转移的距离必须是短距离转移的距离必须是短距离,转移的距离范围在转移的距离范围在128 到到+127个字节。不影响标志位不影响标志位。0113 FFF9 1 010C条件条件 LOOP指令LOOPE/LOOPZZ=1and(CX)0时,保持循环Z1或(CX)=0时,退出循环LOOPNE/LOOPNZZ=0and(CX)0时,保持循环Z0或(CX)=0时,退出循环比较指令比较指令 CMP格
15、式格式:标号标号:CMP 寄存器寄存器/内存内存,寄存器寄存器/内存内存/立即数立即数CMP把第一个操作数和第二个操作数把第一个操作数和第二个操作数相相减减,置位置位/清位清位标志位标志位(A,C,O,P,S),但是不存储结果不存储结果。可以使用CMPS指令比较数据串(字符)(寄存器间接转移)例:;程序从键盘读入1,2,3;当你键入1,2,3时,程序展示1,2,3.MODELSMALL;选择SMALL模式.DATA;指明数据段的开始TABLEDWONE;定义转移列表DWTWODWTHREE.CODE;指明代码段的开始.STARTUP;指明程序的开始(寄存器间接转移)TOP:MOVAH,1;从键
16、盘读入数字INT21H;发送(ASCII)给ALSUBAL,31H;把1,2,3转移到0,1,2JBTOP;比1小CMPAL,2JATOP;比3大MOVAH,0;0,1,2,成倍,变成0,2,4ADDAX,AX;转移列表中的位地址MOVSI,OFFSETTABLE;SI中装入列表起始地址ADDSI,AX;把0,2,4加到转移列表MOVAX,SI;从列表进行ONE,TWO,THREE的;加法 JMP AX;转移到ONE,TWO,THREEONE:MOVDL,1;装入1JMPBOT;展示1TWO:MOVDL,2;装入2JMPBOT;展示2THREE:MOVDL,3;装入3BOT:MOVAH,2;展
17、示1或2或3INT21H.EXIT;返回DOSEND;文件结束5.2过程调用指令Call和RET操作CALL和RET的格式:标号标号:CALL 过程名过程名 标号标号:RET 出栈值出栈值MASM5.0定义RETN为近返回而RETF是远返回。(Call和RET操作)Call指令是把控制传送给被调用的过程。RET指令是从被调用过程返回到原先的调用过程(CALL指令之后的指令之后的指令).RET是被调用过程的最后一条指令。是被调用过程的最后一条指令。.Call.RET 调用过程调用过程 过程过程(Call和RET操作)在同一个段内同一个段内调用一个过程是调用一个过程是近调用近调用。1)近调用的大小
18、是3个字节,第一字节是操作码,第二和第三字节是16 位偏移位偏移 量和距离量和距离。2)E8H是近调用的操作数的编码。(近调用与返回)操作:1.SP减2(一个字)并把把IP(CALL之之后指令的偏移后指令的偏移地址地址=返回地址返回地址)压入压入到堆栈到堆栈中。2.将将指令指令第第2、3字节的位移量加到字节的位移量加到IP=把被调用过程的偏移地址放入IP中。从而将控制权传送给过程。(Nearcallandreturn)Near call(program)before call 内存内存stackFigure 8-Effect on the stack and IP by Near call 0
19、FFF +0003 1002 (近调用与返回)RET(或(或RETN)从一个近过程返回,从一个近过程返回,基本上是基本上是CALL的相反步骤。的相反步骤。1)旧的IP值(16位位)从堆栈出栈,回送到IP。2)SP加2。内存内存SPstackRETNEAR before RET DFigure 8-Effect on the stack and IP by Near RET1远调用与返回远调用去调用标明FAR的过程,这个过程可能在另外一个代码段另外一个代码段里。1)一个远调用的大小是5个字节,第一个字节是操作码码,第二和第三字节是IP(16位偏移),第四跟第五字节是CS.2)远程调用的操作数编码
20、是9AH。(远调用与返回)实现如下:远程调用把CS(第一)和IP(第二)压入栈中,RET(或或 RETF,操作数CBH)把IP 和和CS(32Bit)从栈中弹出。内存(program)CS stackIPFar callFigure 8-Effect on the stack and IP by Far callbefore callSP=FFFFSS=A000IP=0005带寄存器操作数的调用指令格式格式:CALL BX操作操作:IP内容入内容入栈栈 (IP)(BX)(带寄存器操作数的调用指令)例:;程序调用过程DISP,在屏幕上展示“ok”.MODELTINY.CODE.STARTUPMO
21、VBX,OFFSETDISP;通过BX寻址DISPMOVDL,O;展示OCALLBXMOVDL,K;展示KCALLBX.EXIT(带寄存器操作数的调用指令);在监视器屏幕上展示DL中ASCII码的程序DISPPROCNEARMOVAH,2;选择功能码02HINT21H;执行DOS函数RETDISPENDPEND用间接存储器寻址的用间接存储器寻址的CALL指令指令 当程序中要求当程序中要求选择不同的子程序时选择不同的子程序时,通常使,通常使用间接用间接存储器寻址的存储器寻址的CALL指令。指令。格式格式:CALL TABLEBX操作操作:IP内容入内容入栈栈(IP)(BX)+TABLE)(用间接
22、存储器寻址的CALL指令)例:从键盘输入1,2和3,调用三个不同的子程序,分别展示A,B和C。.MODELSMALL.DATATABLEDWONEDWTWODWTHREE(用间接存储器寻址的CALL指令).CODEONEPROCNEARMOVAH,2MOVDL,A;展示AINT21HRETONEENDPTWOPROCNEARMOVAH,2MOVDL,B;展示BINT21H(用间接存储器寻址的CALL指令)RETTWOENDPTHREEPROCNEARMOVAH,2MOVDL,C;展示CINT21HRETTHREEENDP.STARTUPTOP:MOVAH,1;从键盘读取数字,INT21H(用间
23、接存储器寻址的CALL指令)SUBAL,31H;传送1,2,3的ASCII码到0,1,2JBTOP;如果小于0,跳到TOPCMPAL,2JATOP;如果大于2,跳到TOPMOVAH,0;生成列表地址MOVBX,AXADDBX,BX;把0,1,2传送到BX中的0,2,4CALLTABLEBX;调用子程序one,two,three.EXITEND5.3中断服务1)中断中断2)中断向量表中断向量表3)INT 指令与执行指令与执行4)IRET 指令与执行指令与执行(中断服务)什么是中断什么是中断?中断选项提供暂停程序的执行的功能,让系统可以执行特殊的操作.INT n.IRET主程序中断程序(中断服务)
24、什么是中断源什么是中断源?中断是被事件触发的。1)程序错误:例如溢出,2)程序要求:INT指令运行的结果运行的结果,单步模式3)外部中断的要求外部中断的要求:硬盘I/O,4)硬件问题(NMI,非掩盖中断):断电,内存和I/O奇偶校验出错,中断向量表中断向量表是中断处理程序的入口地址表。中断处理程序的入口地址表。(中断向量表)当计算机接通电源的时候,BIOS 与与DOS 在常规内存中的在常规内存中的0000H-03FFH(1024 字字节节)位置位置 建立建立中断向量表中断向量表。(中断向量表)中断向量表提供0 255(00H FFH)的中断(INTn,n是中断类型码中断类型码),每一个中断类型
25、码中断类型码都有相关的4字节的段:偏移地址,CS:IP的形式。(中断向量表)0FF类型(INT0FFH)中断处理程序出入口地址.2类型(INT2)中断处理程序出入口地址1类型(INT1)中断处理程序出入口地址0类型(INT0)中断处理程序出入口地址003FFH003FCH0000CH00008H00004H00000H(03-04H)(CS)(00-01H)(IP)INT指令与执行INT指令任何类型中断都是通过中断指令中断指令INT n H,调用中断服务程序来处理中断事件。中断程序的处理:访问低位内存中的中断向量表中断向量表来来得出中断程序的地址得出中断程序的地址。操作数=中断程序的地址中断程
26、序的地址,被传送到DOS 或者或者BIOS,处理中断事件。中断操作处理完了之后,会返回原来程序。中断调用类似于远CALL指令,因为它把返回地址(IP和CS)存放在堆栈中(INT指令与执行)执行软中断指令,要进行如下操作:执行软中断指令,要进行如下操作:1)将将标志标志寄存器的内容的内容入栈。入栈。2)清除清除I和T标志位位。3)CS寄存器内容内容压压入入堆堆栈。栈。4)IP(下条指令的地址)内容入栈。内容入栈。5)以N*4计算向量的首地址。6)从向量表中,取出2字节的新的新的CS值值、2字节的新新的的IP值值(新的偏移量),存入IP寄存器和CS寄存器中。7)CS:IP中的地址指向中断子程序的起始位置,执行中断子程序。中断指令执行时,清除中断标志(I=0),微处理器禁止中断;当I=1时,微处理器允许中断。INT指令的执行类似于远CALL指令,只是需要把标志压入堆栈只是需要把标志压入堆栈,当然还有CS和IP。INT指令执行PUSHF操作紧跟着完成远CALL指令。IRET指令与执行中断返回指令只用在中断处理程序中IRET功能功能=FarRET+POPFIRET选项:中断通过IRET返回返回,这会把IP,CS和标志和标志位弹出栈位弹出栈并且会根据INT把指令的控制指令的控制也返回。也返回。