
《控制转移类指令》PPT课件.ppt
43页3.2.4 3.2.4 控制转移类指令控制转移类指令l控制转移类指令控制转移类指令用于实现分支、循环、过用于实现分支、循环、过程等程序结构,是仅次于传送程等程序结构,是仅次于传送指令的最常指令的最常用指令用指令重点掌握:JMP/Jcc/LOOP 控控制制转转移移类类指指令令通通过过改改变变IP(和和CS)值值,实现程序执行顺序的改变实现程序执行顺序的改变jmp again;转向;转向again处继续执行处继续执行again:dec cx;标号;标号again的指令的指令jmp output;转向;转向outputoutput:mov result,al;标号;标号output的指令的指令JMP 0120H;直接转向;直接转向CS:0120H:0120H单元单元无条件转移指令无条件转移指令2. 条件转移指令条件转移指令格式:格式: Jcc label label: ;条件满足,跳转;条件满足,跳转标号标号label指定的目标地指定的目标地址去执行指令址去执行指令 ;条件不满足,顺序执行条件不满足,顺序执行下一条指令下一条指令 ;操作数操作数label是采用短转移,称为相对寻址方式是采用短转移,称为相对寻址方式Jcc指令的分类指令的分类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:.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:2000H34HAREA1AREA2 .AREA1+1AREA2+1 . .AREA1+99AREA2+99 .SIDISI=2000HSI AREA10INCSISI=2001HSI AREA11【例】等价程序【例】等价程序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赋初值循环3. 循环指令循环指令 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 2A3.2.5 系统功能调用系统功能调用l21H号中断是号中断是DOS提供给用户的用于调用系提供给用户的用于调用系统功能的中断,它有近百个功能供用户选择统功能的中断,它有近百个功能供用户选择使用,主要包括设备管理、目录管理和文件使用,主要包括设备管理、目录管理和文件管理三个方面的功能管理三个方面的功能lROM-BIOS也以中断服务程序的形式,向程序员提供系统也以中断服务程序的形式,向程序员提供系统的基本输入输出程序的基本输入输出程序l汇编程序设计需要采用系统的各种功能程序汇编程序设计需要采用系统的各种功能程序l充分利用操作系统提供的资源是程序设计的一个重充分利用操作系统提供的资源是程序设计的一个重要方面要方面功能调用的步骤功能调用的步骤通常按照如下通常按照如下4 4个步骤进行:个步骤进行: 在在AHAH寄存器中设置系统功能调用号寄存器中设置系统功能调用号 在指定寄存器中设置入口参数在指定寄存器中设置入口参数 执行指令执行指令INT 21HINT 21H(或(或ROM-BIOSROM-BIOS的中断向的中断向量号)实现中断服务程序的功能调用量号)实现中断服务程序的功能调用 根据出口参数分析功能调用执行情况根据出口参数分析功能调用执行情况1. 字符输出的功能调用字符输出的功能调用lDOS功能调用功能调用 INT 21Hl功能号:功能号:AH02Hl入口参数:入口参数:DL字符的字符的ASCII码码l功能:在显示器当前光标位置显示给定的字功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置。
如按符,光标右移一个字符位置如按Ctrl-Break或或Ctrl-C则退出则退出mov ah,02h mov ah,02h ;设置功能号:;设置功能号:ah02hah02hmov dl,? mov dl,? ;提供入口参数:;提供入口参数:dl?dl?int 21h int 21h ;在当前显示器光标位置显示一个问号;在当前显示器光标位置显示一个问号 进进行行字字符符输输出出时时,当当输输出出响响铃铃字字符符(07H)以以及及退退格格(08H)、回回车车(0DH)和和换换行行(0AH)字字符符时,该功能调用可以自动识别并能进行相应处理时,该功能调用可以自动识别并能进行相应处理2. 字符串输出的功能调用字符串输出的功。












