《微机原理与接口 第4章5_控制类指令》由会员分享,可在线阅读,更多相关《微机原理与接口 第4章5_控制类指令(34页珍藏版)》请在金锄头文库上搜索。
1、1,五、控制转移类指令,能够使程序的执行流程发生改变的指令当程序发生转移时,CS和IP的值可由指令指定。段间转移或段间调用可用FAR表示段内转移或段内调用可用NEAR表示若短距离内的转移(-128127),称为短转移,用SHORT表示,2,控制转移类指令,控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的常用指令重点掌握: JMP/Jcc/LOOP/JCXZ CALL/RET INT n/IRET 常用系统功能调用,控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变,3,目标地址的寻址范围:段内寻址,段内转移近转移(near)在当前代码段64KB范围内转移( 32
2、KB范围)不需要更改CS段地址,只要改变IP偏移地址段内转移短转移(short)转移范围可以用一个字节表达,在段内128127范围的转移,4,目标地址的寻址范围:段间寻址,段间转移远转移(far)从当前代码段跳转到另一个代码段,可以在1MB范围需要更改CS段地址和IP偏移地址目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址,代码段,代码段,实际编程时,汇编程序会根据目标地址的属性,自动处理成短转移、近转移或远转移 程序员可用操作符short、near ptr 或far ptr 强制成为需要的转移类型,5,1 无条件转移指令,只要执行无条件转移指令JMP,就使程序转到指定的目标地
3、址,从目标地址处开始执行指令操作数label是要转移到的目标地址(目的地址、转移地址)JMP指令分成4种类型: 段内转移、相对寻址,short,near 段内转移、间接寻址 段间转移、直接寻址 段间转移、间接寻址,JMP label;程序转向label标号指定的地址,6,无条件转移指令JMP(jump),JMP label;段内转移、相对寻址;IPIP位移量 JMP r16/m16;段内转移、间接寻址;IPr16/m16 JMP far ptr label;段间转移、直接寻址;IP偏移地址,CS段地址 JMP far ptr mem;段间转移,间接寻址;IPmem,CSmem2,演示,演示,演
4、示,演示,目的地址存储器段间间接寻址方式演示,目的地址相对寻址方式,目的地址寄存器段内间接寻址方式,目的地址存储器段内间接寻址方式,目的地址段间直接寻址方式,目的地址存储器段间间接寻址方式,12,2.条件转移根据判断条件是否成立决定是否转移。按照判断条件的不同分为以下类型:单个标志、无符号数判断、有符号数判断、CX寄存器。条件转移都是段内直接短转移,即(IP)=(IP)+Data8类型的转移。 判断单个标志ZF: JZ(JE), JNZ(JNE)SF: JS, JNSOF: JO, JNOPF: JP, JNPCF: JC, JNC,13, 判断无符号数的大小助记符中的意义: A:大于,B:小
5、于,E:等于JB(JNAE),JNB(JAE)同JC,JNC,JBE(JNA),JNBE(JA): 判断CF and ZF 判断有符号数的大小助记符中的意义: G:大于,L:小于,E:等于JL(JNGE): SF xor OF = 1JNL(JGE): SF xor OF = 0JLE(JNG):(SF xor OF) and ZF = 1JNLE(JG):(SF xor OF) and ZF = 0,使用比较大小的指令时,必须区分是有符号数还是无符号数。,14, 判断CX寄存器JCXZ: CX=03.循环循环指令的转移也都是段内直接短转移,即(IP)(IP)+Data8类型的转移。LOOP
6、循环判断CX是否等于零,不等于零则循环LOOPZ(LOOPE) 当为零或相等时循环判断CX是否等于零,不等于零且ZF=1则循环LOOPNZ(LOOPNE) 当不为零或不相等时循环判断CX是否等于零,不等于零且ZF=0则循环,15,操作: CX CX1 根据判断结果确定是否循环说明: 循环指令不影响状态标志。 如果目标位置的位移量超出Data8所能够表示的范围,则需要用JMP辅助来完成循环。,条件转移指令的含义,JZ/JEJump on Zero/EqualJNZ/JNEJump on Not Zero/EqualJSJump on SignJNSJump on Not SignJP/JPEJu
7、mp on Parity/Parity EvenJNP/JPOJump on Not Parity/Parity OddJOJump on OverflowJNOJump on Not OverflowJC/JB/JNAEJump on Carry/Below/Not Above or EqualJNC/JNB/JAEJump on Not Carry/Not Below/Above or EqualJBE/JNAJump on Below or Equal/Not AboveJNBE/JAJump on Not Below or Equal/AboveJL/JNGEJump on Less/
8、Not Greater or EqualJNL/JGEJump on Not Less/Greater or EqualJLE/JNGJump on Less or Equal/Not GreaterJNLE/JGJump on Not Less or Equal/Greater,17,表4.7 条件转移指令,18,例4.16 在内存的数据段中存放了若干个8位带符号数,数据块的长度为COUNT(不超过255),首地址为TABLE,试统计其中正数、负数及零的个数,并分别将统计结果存入PLUS、MINUS和ZERO单元中。编程如下:初始化XOR AL,AL ;(AL)0MOV PLUS,AL ;清
9、PLUS单元MOV MINUS,AL ;清MINUS单元MOV ZERO,AL ;清ZERO单元LEA SI,TABLE ;(SI)数据表首址MOV CX,COUNT;(CX)数据表长度CLD ;清状态标志位DF,19,CHECK:LODSB ;取一个数据到AL OR AL,AL ;使数据影响状态标志位 JS X1 ;如为负,转X1 JZ X2 ;如为零,转X2 INC PLUS ;否则为正,PLUS单元加1 JMP NEXT X1: INC MINUS ;MINUS单元加1 JMP NEXTX2: INC ZERO ;ZERO单元加1NEXT: LOOP CHECK ;CX减1,如不为零,则
10、转CHECK HLT ;停止,20,例4.17 在以DATA1为首址的内存数据段中,存放了200个16位带符号数,试将其中最大和最小的带符号数找出来,分别存放到以MAX和MIN为首的内存单元中。 必须注意,比较带符号数的大小时,应该采用JG和JL等条件转移指令。根据要求可编程如下: LEA SI,DATA1;(SI)数据块首址MOV CX,200 ;(CX)数据块长度CLD ;清方向标志DFLODSW ;取一个16位带符号数到AXMOV MAX,AX ;送MAX单元MOV MIN,AX ;送MIN单元 DEC CX ;(CX)(CX) 1,21,NEXT:LODSW ;取下一个16位带符号数
11、CMP AX,MAX ;与MAX单元内容比较 JG GREATER ;大于MAX,则转GREATER CMP AX,MIN ;否则,与MIN单元内容比较 JL LESS ;小于MIN,则转LESS JMP GOON ;否则,转GOONGERATER:MOV MAX,AX ;(MAX)(AX) JMP GOON ;转GOONLESS: MOV MIN,AX ;(MIN)(AX)GOON:LOOP NEXT ;CX减1,若不等于零,转NEXT HLT ;停止,22,4.子程序调用,子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行当
12、运行完子程序功能后,采用RET返回指令回到主程序继续执行,主程序与子程序演示,转移指令有去无回 子程序调用需要返回,其中利用堆栈保存返回地址,主程序与子程序,CALL label,主程序,RET,子程序,回到CALL指令后的指令处返回地址,24,子程序调用与返回指令子程序(过程)通常是一个完整的、独立的有一定名称(标号)的程序段,它可以多次被调用,并在这个程序段执行完后可返回到原先调用的程序处。子程序执行的过程分为三步: 子程序调用(即从主程序转移到子程序的首地址),用CALL指令。 执行子程序 返回(即从子程序转移到主程序),用RET指令。,25,主程序 子程序 SUBP1 PROC NEA
13、R START: CALL SUBP1 MOV AL,01H CALL SUBP1 MOV AX,AX RETHLT SUBP1 ENDP,26,(1) 子程序调用指令CALL,CALL指令分成4种类型(类似JMP)CALL label;段内调用、直接寻址CALL r16/m16;段内调用、间接寻址CALL far ptr label;段间调用、直接寻址CALL far ptr mem;段间调用、间接寻址CALL指令需要保存返回地址:段内调用入栈偏移地址IPSPSP2,SS:SPIP段间调用入栈偏移地址IP和段地址CSSPSP2,SS:SPCS,先PUSH CSSPSP2,SS:SPIP, 后PUSH IP,