《选择和循环》PPT课件.ppt

上传人:小飞机 文档编号:5611588 上传时间:2023-08-02 格式:PPT 页数:149 大小:364.50KB
返回 下载 相关 举报
《选择和循环》PPT课件.ppt_第1页
第1页 / 共149页
《选择和循环》PPT课件.ppt_第2页
第2页 / 共149页
《选择和循环》PPT课件.ppt_第3页
第3页 / 共149页
《选择和循环》PPT课件.ppt_第4页
第4页 / 共149页
《选择和循环》PPT课件.ppt_第5页
第5页 / 共149页
点击查看更多>>
资源描述

《《选择和循环》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《选择和循环》PPT课件.ppt(149页珍藏版)》请在三一办公上搜索。

1、1,新 编汇编语言程序设计,2,第四章 选择和循环,4.1 测试和控制指令 4.2 选择结构程序4.3 循环结构程序4.4 程序的调试 习题四,3,按照指令执行的顺序,程序的结构可以划分成以下三种。顺序结构:程序按照它编写的顺序执行,每条指令只执行一 次,这样的程序称为“顺序结构”的程序。循环结构:一组指令被反复地执行,这样的程序称为“循环结 构”或者“重复结构”的程序。选择结构:根据某个条件,一部分指令被执行,另一部分指 令没有被执行,这样的程序称为“选择结构”或者“分支结构”的程序。一个实际运行的程序,常常是由以上三种结构的程序组合而成的,上面的三种结构称为程序的“基本结构”。使用这三种基

2、本结构,可以编写出任何所需要的程序。,4,4.1 测试和转移控制指令,4.1.1 无条件转移指令4.1.2 比较和测试指令 4.1.3 条件转移指令,5,执行JMP指令后,程序转移到新的“目的位置”执行。,4.1.1 无条件转移指令,无条件转移指令的一般格式:,JMP目的位置,6,CODESEGMENTASSUMECS:CODESTART:MOVDL,20HONE:MOVAH,2INT21H;输出DL中的字符INCDL;修改DL中的字符代码JMPONE;转移到“ONE”处继续执行MOVAX,4C00HINT21HCODEENDSENDSTART,例4-1 用JMP指令实现转移,7,1.近程无条

3、件转移指令 如果转移的目的位置与出发点在同一个段里,这样的转移称为“近程”转移或者“段内”转移。实现“近程”转移,实质上是把目标位置的“偏移地址”置入IP寄存器。按照寻址方式的不同,近程无条件转移指令有三种格式。,8,(1)短转移如果目的位置离开出发点很近,可以使用以下格式:JMPSHORT LABEL其中“LABEL”是目的位置的标号。这种格式产生的机器指令代码最短,为2字节。,100H:JMPSHORT TWO102H:10CH:TWO:,指令“JMP SHORT TWO”汇编后产生的机器指令为“EB0A”。“EB”是这种类型转移指令的“操作码”,“0A”是目的位置离开出发点的距离,10C

4、H102H=0AH。由于用一个字节补码表示目的地址与当前地址的距离,所以转移范围为下一条指令地址-128+127字节以内。,9,(2)近程直接转移JMP目的位置标号,指令“JMP TWO”汇编后得到的机器指令代码为“E9FDEE”。“E9”为操作码“0EEFDH”为位移量,0EEFDH=0F000H103H。指令“JMP ONE”对应的机器指令代码为“E90011”“E9”为操作码位移量“1100H”,0F003H+1100H=0103H(舍去进位)使用近程直接转移指令可以实现同一个段内64KB范围的转移。,100H:JMPTWO103H:ONE:0F000H:TWO:JMPONE0F003H

5、:,10,(3)近程间接转移 把转移的目的地址事先存放在某个寄存器或存储器单元中,通过这个寄存器或存储单元实现转移。,JMP CX;寄存器间接转移,可使用任何一个通用寄存器JMP WORD PTRBX;存储器间接转移,目的地址在存储单元中,11,1)JMP ONE;近程直接转移2)LEA DX,ONE JMP DX;寄存器间接段内转移3)LEA BX,TARGET JMP WORD PTRBX;存储器间接段内转移4)JMP TARGET;存储器间接段内转移,已在数据段定义存储器单元“TARGET”:TAEGETDW ONE下面四组指令都可以实现向标号“ONE”的转移:,12,远程无条件转移指令

6、可以实现不同的段之间的转移,执行该指令时,CPU把目的段的段基址装入CS,目的位置的段内偏移地址装入IP。有直接寻址和间接寻址两种格式。(1)远程直接转移JMP FAR PTR 远程标号指令汇编后,对应的机器指令为5个字节:1个字节操作码“0EAH”2个字节目的地址的段内偏移地址 2个字节目的标号所在段的段基址,2远程无条件转移指令,13,(2)远程间接转移 远程转移需要32位的目的地址,使用间接转移时,需要把32位目的地址事先装入用“DD”定义的存储单元。,1)JMP FAR PTR TWO;远程直接转移2)LEA BX,FAR_TGT JMP DWORD PTRBX;远程间接转移3)JMP

7、 FAR_TGT;远程间接转移,假设已在数据段定义存储器单元“FAR_TGT”如下:FAR_TGTDDTWO下面三组指令都可以实现向远程标号“TWO”的转移:,14,4.1.2 比较和测试指令,(1)CMP(Compare,比较)指令指令格式:CMP目的操作数,源操作数目的操作数:8位/16位/32位的寄存器/存储器操作数。源操作数:与目的操作数同类型的寄存器/存储器/立即数。功能:目的操作数-源操作数,保留运算产生的标志位,不保留运算的差。用来比较两个有符号数或无符号数的大小。,15,假设(ECX)=8090A0B0H,指令“CMP ECX,0”执行后:ZF=0(ECX)0 OF=0 减法操

8、作没有产生溢出(SF是正确的结果符号位)SF=1 如果ECX中存放的是有符号数,这个数是负数 CF=0 如果ECX中存放的是无符号数,这个数大于0这条指令与下面的指令等效:ORECX,0;根据ECX的值确定SF,ZF AND ECX,0FFFFFFFFH;根据ECX的值确定SF,ZF XOR ECX,0;根据ECX的值确定SF,ZF,16,CF=0,目的操作数源操作数CF=1,目的操作数源操作数,对于有符号数:OF=0时,SF为正确的结果符号 OF=1时,SF与正确的符号位相反 OFSF的运算结果反映了正确的结果符号,OFSF=0,目的操作数源操作数OFSF=1,目的操作数源操作数,对于无符号

9、数:,17,ZF=0(X)5OF=0 减法操作没有产生溢出,SF是正确的结果符号位SF=1 如果X中存放的是有符号数,X5,假设存储器变量(X)=80H,指令“CMP X,5”执行后:,18,(2)TEST(Test,测试)指令指令格式:TEST目的操作数,源操作数目的操作数:8位/16位/32位的寄存器/存储器操作数。源操 作数:与目的操作数同类型的寄存器/存储器/立即数。功能:TEST指令将目的操作数与源操作数进行逻辑乘运算,保留运算产生的各标志位,但是不保留逻辑乘的结果。该指令用来测试目的操作数中某几位二进制的特征。,19,如果ZF=0,说明BL寄存器的D2D100,这两位为01,10或

10、11。如果ZF=1,说明BL寄存器的D2D100,这两位为00。,指令 TESTVAR,1 执行后:,如果ZF=0,说明变量VAR的D0位为1,该数为奇数如果ZF=1,说明变量VAR的D0位为0,该数为偶数,指令 TESTBL,6 执行后:,20,(3)BT(Bit Test,位测试)指令指令格式:BT目的操作数,源操作数目的操作数:16位/32位的寄存器/存储器操作数。源操作数:与目的操作数同类型的寄存器操作数或0255以内 的立即数。功能:BT指令将目的操作数内部由源操作数指定的那一位二进制的值送入CF,两个操作数的值均不改变。该指令用来测试目的操作数中某一位二进制的值。,21,BTS目的

11、操作数,源操作数;测试目的操作数的指定位,并把该位置为1BTR目的操作数,源操作数;测试目的操作数的指定位,并把该位置为0BTC目的操作数,源操作数;测试目的操作数的指定位,并把该位取反,设(EDX)=12345678H,(ECX)=5,BT EDX,ECX;由于EDX寄存器D5=1,执行后CF=1,EDX值不变BT EDX,2;由于EDX寄存器D2=0,执行后CF=0,EDX值不变,与BT指令类似的还有以下三条指令:,22,4.1.3 条件转移指令,“J”是条件转移指令操作码的第一个字母“cc”是代表转移条件的13个字母“label”是转移目的地的标号。,条件转移指令格式:,Jcclabel

12、,23,(1)根据两个有符号数比较结果的条件转移指令两个有符号数的比较结果通过OF,SF,ZF反映出来,G(Greater,大于)L(Less,小于)E(Equal,等于)N(Not,否),例:JG大于(不小于等于)则转移 JNL 不小于(大于或等于)则转移 JE等于(为零)则转移,24,根据有符号数大小的条件转移指令,25,MOVAX,X;取出X的值送AXCMPAX,Y;比较两个操作数,建立需要的标志位JGGREATER;如果XY,转移到“GREATER”处执行JEEQUAL;如果X=Y,转移到“EQUAL”处执行LESS:;否则,执行标号“LESS”处的指令GREATER:EQUAL:,下

13、面程序根据有符号字变量X和Y的大小决定程序的走向。,26,SUBAX,BX;AX(AX)(BX),建立标志位JGESKIP;如果(AX)0,转标号“SKIP”NEGAX;如果(AX)0,把AX的值取反SKIP:,JG GREATER;如果XY,转移到“GREATER”处 JE EQUAL;如果X=Y,转移到“EQUAL”处 JL LESS;如果XY,转移到“LESS”处LESS:,这个程序能够正确运行,最后一条指令有“画蛇添足”之嫌。,下面的程序计算 AX=|AXBX|,27,(2)根据两个无符号数比较结果的条件转移指令两个有符号数的比较结果通过CF,ZF反映出来,代表转移条件的字母:,A(A

14、bove,高于)B(Below,低于)E(Equal,等于),28,根据无符号数大小的条件转移指令,29,(3)根据单个标志位的条件转移指令,30,JNGSkipJMPLabelSkip:,对于16位80X86CPU,条件转移指令的转移范围在下一条指令地址128127字节之间。如果转移目的位置超出了上述范围,汇编时将报告错误。,对于32位80X86CPU,条件转移指令汇编后产生4字节机器代码,前2字节是它的操作码,后面2字节是表示转移距离的位移量,可以实现64KB范围内的转移。,JG Label;如果标号“Label”超出范围,汇编时将出错,可以把上面指令修改为:,31,(4)根据CX/ECX

15、寄存器值的条件转移指令指令格式:JCXZLabel;若CX=0,转移到Label JECXZLabel;若ECX=0,转移到Label它们的转移范围固定为下一条指令地址128127字节以内。,32,4.2 选择结构程序,4.2.1 基本选择结构4.2.2 单分支选择结构4.2.3 复合选择结构4.2.4 多分支选择结构,33,为“|X|3”和“|X|3”分别编制了进行不同处理的指令序列。如果条件“|X|3”成立(为“真”),执行“Y=3X5”如果条件“|X|3”不成立(为“假”),执行Y=6通过在不同的程序之间进行选择,实现程序的不同功能,“选择结构”因此得名。,计算分段函数的值,34,4.2

16、.1 基本选择结构,35,CODESEGMENTASSUMECS:CODESTART:JMPBEGINXDB?;被测试的数,汇编之前置入YESDB0AH,0DH,“Its a even number.”,0AH,0DH,$NODB0AH,0DH,“Its a odd number.”,0AH,0DH,$BEGIN:PUSHCSPOPDS,例4-2 判断变量X的值是否为“偶数”,36,TESTX,1;测试X的最低位,确定是否为偶数JZEVN;ZF=1,该数是偶数,转向“EVN”ODD:LEADX,NO;否则,该数是奇数MOVAH,9INT21H;输出奇数的相关信息JMPDONE;跳过程序“EVN

17、”EVN:LEADX,YESMOVAH,9INT21H;输出偶数的相关信息DONE:MOVAX,4C00HINT21HCODEENDSENDSTART,37,TESTX,1;测试X的最低位,确定是否为偶数JZEVN;ZF=1,该数是偶数,转向“EVN”ODD:LEA DX,NO;否则,该数是奇数JMP DONE;跳过程序“EVN”EVN:LEA DX,YES;该数是偶数DONE:MOVAH,9INT21H;输出该数的相关信息MOV AX,4C00H,如果两个“平行”分支有相同的处理过程,可以把它们“合并”:,38,变量X取值93H,汇编、连接后运行该程序,程序输出:Its a odd numb

18、er.变量X取值94H,汇编、连接后运行该程序,程序输出:Its a even number.,39,DATASEGMENTPROMPT DB 0DH,0AH,“Input a lowercase letter:$”;提示ERR_MSG DB 0DH,0AH,“Input error.$”;输入错误警告BUFDB 0DH,0AH,Prev:;输出缓冲区PREVDB 20HDB 0DH,0AH,Succ:SUCCDB 20HDB 0DH,0AH,$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,例4-3 从键盘上输入一个小写字母,显示该字母的前导和后继。,40,

19、START:MOVAX,DATAMOVDS,AXINPUT:LEADX,PROMPTMOVAH,9INT21H;输出提示信息MOVAH,1INT21H;输入一个字符CMPAL,a;输入正确性检查JBERRORCMPAL,zJAERRORMOVBL,AL;计算“前导”字母DECBL,41,CMPBL,aJBSKIP1;“前导”非字母,跳过MOVPREV,BL;保存“前导”字母SKIP1:INCAL;计算“后继”字母CMPAL,zJASKIP2;“后继”非字母,跳过MOVSUCC,AL;“后继”为字母,保存SKIP2:LEADX,BUF;输出“前导”和“后继”字母MOVAH,09HINT21HJM

20、PEXIT;跳过出错处理程序,42,ERROR:LEA DX,ERR-MSG;显示出错信息MOVAH,09HINT21HJMPINPUT;要求重新输入EXIT:MOVAX,4C00H;返回OSINT21HCODEENDSENDSTART,健壮性预设结果,程序要点:,43,例4-4 计算分段函数,INCLUDEYLIB.HDATASEGMENTPROMPTDB0DH,0AH,“Input X(-10000+10000):$”XDW?OUT_MSGDB0DH,0AH,“Y=$”DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVD

21、S,AX;装载DS,44,LEADX,PROMPT;输入提示信息CALLREADINT;从键盘上输入X的值MOVX,AX;保存输入值COMP:CMP X,3;比较,X3?JGGREATER;X3成立,转“GREATER”CMPX,-3;比较,X3?JLGREATER;X3成立,转“GREATER”LESS:;|X|3 的程序段MOVBX,AX;BXXSALAX,1;AX2XADDAX,BX;AX2X+XSUBAX,5;AX3X5JMPOUTPUT,45,GREATER:MOV AX,6;|X|3 的程序段OUTPUT:LEA DX,OUT_MSG;结果的前导文字CALL WRITEINT;输出

22、计算结果CALL CRLF;输出回车换行EXIT:MOV AX,4C00HINT 21HCODEENDSEND START,46,复合逻辑表达式的分解,47,4.2.2 单分支选择结构,如果选择结构的一个分支为“空”,这样的程序流程称为“单分支选择结构”。合理地选择Jcc指令所使用的条件,可以使程序更加流畅。可以把一些基本选择结构程序改写为单分支选择结构。,48,例4-4为例,可以将Y“预设”为6,一旦条件|X|3成立,立即转向OUTPUT输出“预设”的结果,否则进行相应的计算。,49,COMP:MOV AX,6;预设AX=6CMP X,3;比较,X3?JG OUTPUT;若X3,转OUTPU

23、T输出CMP X,-3;比较,X3?JL OUTPUT;若X3,转OUTPUT输出LESS:;|X3 的程序段MOV AX,X;AXX MOV BX,AX;BXXSAL AX,1;AX2XADD AX,BX;AX2X+XSUB AX,5;AX3X5OUTPUT:LEA DX,OUT_MSG;结果的前导文字 CALL WRITEINT;输出计算结果,50,例4-5 将4位二进制转换成对应的十六进制字符,MOVAL,X CMPAL,9 JAALPH ADDAL,30H JMPDONEALPH:ADDAL,37HDONE:MOVY,AL,MOVAL,X ORAL,30H CMPAL,9 JBEDON

24、E ADDAL,7DONE:MOVY,AL,51,选择结构一个分支的程序中又出现了选择结构,这样的结构称为“复合选择结构”或者“嵌套选择结构”。,4.2.3 复合选择结构,排除法:每次判断排除若干可能,留下一种可能情况进行处理;确认法:每次判断确认一种可能,对已确认的情况进行处理。,52,;方法a,逐项排除 CMPX,0 JGEUN_MINUSMINUS:MOVY,-1 JMPDONEUN_MINUS:JEZERO MOVY,1 JMPDONEZERO:MOVY,0DONE:,;方法b,逐项确认 CMPX,0 JGPLUS JEZEROMINUS:MOVY,-1 JMPDONEPLUS:MOV

25、Y,1 JMPDONEZERO:MOVY,0DONE:,例4-6 计算Y=SGN(X),53,复合分支选择结构,54,4.2.4 多分支选择结构,在选择结构程序里,如果可供选择的程序块多于两个,这样的结构称为多分支选择结构,如下图(a)所示,下图(b)是汇编语言程序的实现方法。,55,DATASEGMENTPROMPTDB0DH,0AH,“Input a number(13):$”MSG1 DB0DH,0AH,“FUNCTION 1 EXECUTED.$”MSG2 DB0DH,0AH,“FUNCTION 2 EXECUTED.$”MSG3 DB0DH,0AH,“FUNCTION 3 EXECU

26、TED.$”DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,例4-7 从键盘上输入数字“1”到“3”,根据输入选择对应程序 块执行。,56,INPUT:LEADX,PROMPTMOVAH,9INT21H;输出提示信息MOVAH,1INT21H;输入一个数字CMPAL,1JBINPUT;“0”或非数字,重新输入JEF1;数字“1”,转F1CMPAL,2JEF2;数字“2”,转F2CMPAL,3JEF3;数字“3”,转F3JMPINPUT;大于“3”,重新输入,57,F1:LEADX,MSG1;F1程序块JMPOUT

27、PUTF2:LEADX,MSG2;F2程序块JMPOUTPUTF3:LEADX,MSG3;F3程序块JMPOUTPUTOUTPUT:MOVAH,9INT21HMOVAX,4C00HINT21HCODEENDSENDSTART,58,把完成各功能的程序块入口地址放在一张表格中,根据输入,计算出该功能程序块入口地址在表中的位置,通过存储器间接转移转入对应位置执行。,DATASEGMENT PROMPTDB 0DH,0AH,“Input a number(13):$”MSG1DB 0DH,0AH,“FUNCTION 1 EXECUTED.$”MSG2DB 0DH,0AH,“FUNCTION 2 EX

28、ECUTED.$”MSG3DB 0DH,0AH,“FUNCTION 3 EXECUTED.$”ADDTBLDW F1,F2,F3DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,59,START:MOV AX,DATAMOVDS,AXINPUT:LEADX,PROMPTMOVAH,9INT21H;显示提示信息MOVAH,1INT21H;输入一个数字CMPAL,1JBINPUT;不正确输入,重新输入CMPAL,3JAINPUT;不正确输入,重新输入,60,SUBAL,1;将数字字符“1”到“3”转换为0,1,2SHLAL,1;转换为0,2,4MOVBL,ALMOV

29、BH,0;转入BXJMPADDTBLBX;间接寻址,转移到对应程序块F1:LEADX,MSG1;F1程序块JMPOUTPUTF2:LEADX,MSG2;F2程序块JMPOUTPUTF3:LEADX,MSG3;F3程序块JMPOUTPUT;这条指令可以省略,61,OUTPUT:MOVAH,9INT21HMOVAX,4C00HINT21HCODEENDSENDSTART,62,4.3 循环结构程序,4.3.1 循环指令4.3.2 计数循环4.3.3 条件循环4.3.4 多重循环,63,循环结构也称为“重复结构”,它使得一组指令重复地执行,可以用有限长度的程序完成大量的处理任务,几乎所有的应用程序中

30、都离不开循环结构。循环一般由以下4个部分组成:,(1)初始化部分:为循环做准备,如累加器清零,设置地址指针和计数器的初始值等。(2)工作部分:实现循环的基本操作,也就是需要重复执行的一段程序。(3)修改部分:修改指针、计数器的值,为下一次循环做准备。(4)控制部分:判断循环条件,结束循环或继续循环。,64,计数循环:循环的次数事先已经知道,用一个变量(寄存器或存储器单元)记录循环的次数(称为“循环计数器”)。进行减法计数时,循环计数器的初值直接设为循环次数,每循环一次将计数器减1,计数器减为0时,循环结束。条件循环:循环的次数事先并不确定,每次循环开始前或结束后测试某个条件,根据这个条件是否满

31、足来决定是否继续下一次循环。,按照循环结束的条件,有以下两类循环:,65,按照循环结束判断在循环中的位置,有以下两种结构的循环:,WHILE循环:进入循环后,先判断循环结束条件,条件满足则退出循环,循环次数最少为0次。DO-WHILE循环:进入循环后,先执行工作部分,然后判断循环继续的条件,条件满足则转向工作部分继续循环,循环次数最少1次。,66,67,LOOPLabel;CXCX-1,若(CX)0,转移到LabelLOOPZ/LOOPE Label;CXCX-1,若(CX)0且ZF=1,转移到LabelLOOPNZ/LOOPNELabel;CXCX-1,若(CX)0且ZF=0,转移到Labe

32、l,4.3.1 循环指令,循环指令采用相对寻址方式,Label距离循环指令的下一条指令必须在-128+127B之内。,68,LOOPZ/LOOPE,LOOPNZ/LOOPNE指令的功能也可以由Jcc指令实现。由于对CX先减1,后判断,如果CX的初值为0,将循环65536次。循环指令的执行不影响标志位。,LOOP指令的功能可以用Jcc指令实现:,DECCX;CXCX-1JNZLabel;若(CX)0(也就是ZF=0),转移到Label,69,计数循环是基本的循环组织方式,用循环计数器的值来控制循环,有时候也可以结合其它条件共同控制。,4.3.2 计数循环,例4-8 从键盘上输入一个字符串(不超过

33、80个字符),将它逆序后输出。,INCLUDEYLIB.HDATASEGMENTBUFFERDB81,?,81 DUP(?)MESSDB0AH,0DH,“Input a string please:$”DATAENDS,70,CODESEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOVDS,AXLEADX,MESSMOVAH,09HINT21H;输出提示信息MOVAH,0AHLEADX,BUFFERINT21H;输入字符串CALLCRLFLEABX,BUFFER;缓冲区首地址送BXMOVCL,BUFFER+1MOVCH,0;输入字符个数送CX(循环

34、次数),71,ADDBX,CXINCBX;计算字符串末地址送BX(指针)DISP:MOV DL,BXMOVAH,02HINT21H;逆序输出一个字符DECBX;修改指针LOOPDISP;计数循环CALLCRLF;输出换行、回车,结束本行MOVAX,4C00HINT21HCODEENDSENDSTART,72,INCLUDEYLIB.HDATASEGMENTMESS1DB0AH,0DH,“Input a number:$”MESS2DB0AH,0DH,“The number in hexdecimal is:$”HEXTABDB“0123456789ABCDEF”DATAENDSCODESEGM

35、ENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,例4-9 从键盘上输入一个十进制无符号整数,将它用十六进制格式输出。,73,LEADX,MESS1CALLREADDEC;输入一个十进制无符号数MOVSI,AX;转存在SI中LEADX,MESS2MOVAH,9INT21H;输出文字前导MOVCX,4;循环次数初值LEABX,HEXTAB;换码表首地址ONE:PUSHCXMOVCL,4 ROLSI,CL;把最高4位移到最低4位,74,MOVAX,SI;转入AX中ANDAX,000FH;保留最低4位XLAT;查表,转换成十六进制字符的ASCII代码M

36、OVDL,ALMOVAH,2 INT21H;输出一个十六进制字符POPCXLOOPONE;计数循环CALLCRLF;输出回车换行,结束本行MOVAX,4C00HINT21HCODEENDSENDSTART,75,用总分减去最高分、最低分,最后除以5,得到需要的成绩。求N个数据中最大值的方法:预设一个“最大值”,取出一个数据与这个“最大值”进行比较,如果数据大于“最大值”,则将该数据作为新的“最大值”。进行N次比较之后留下的就是这N个数据的最大值。预设的“最大值”的初值可以从N个数据中任取一个,也可以根据数据的范围,取一个该范围内的最小的数。计算最小值的方法与此类似。,例4-10 从键盘上输入七

37、名裁判的评分(010),扣除一个最高分,一个最低分,计算出其它五项评分的平均值(保留一位小数),在显示器上输出。,76,INCLUDEYLIB.HDATASEGMENTMESS1DB0DH,0AH,“Input a score(010):$”MESS2DB0DH,0AH,“The final score is:$”C5DB5MAXDB?MINDB?SUMDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,77,MOVSUM,0;累加器清零MOVMAX,0;“最大值”预设为0MOVMIN,255;“最小值”预设为

38、255MOVCX,7;循环计数器,初值7ONE:LEADX,MESS1CALLREADDEC;键盘输入一个分数ADDSUM,AL;累加CMPMAX,AL;与“最大值”比较JAL1MOVMAX,AL;大于“最大值”则保留L1:CMPMIN,AL;与“最小值”比较JBL2MOVMIN,AL;小于“最小值”则保留L2:LOOPONE;计数循环,78,MOVAL,SUMSUBAL,MAXSUBAL,MIN;从总分中减去最大、最小值MOVSUM,ALXORAH,AH;高8位清零DIVC5;求平均值PUSHAX;保留余数(在AH中)MOVAH,0;清余数LEADX,MESS2CALLWRITEDEC;输出

39、结果的整数部分,79,MOVDL,.MOVAH,2INT21H;输出小数点POPAX;从堆栈弹出余数SHLAH,1;计算小数部分:(AH5)10=AH2MOVDL,AH;ORDL,30H;转换成ASCII代码MOVAH,2INT21H;输出结果的小数部分CALLCRLF;输出回车换行,结束本行MOVAX,4C00HINT21HCODEENDSENDSTART,80,“稀疏矩阵”是指存在大量零元素的矩阵。为了节约存储空间,通常不存储那些值为零的元素。稀疏矩阵通常用一个“标尺”记录哪些位置上有非零元素。标尺RULE=0001 0000 0010 0000B表示一个16个元素的稀疏矩阵,它仅在第3,

40、10位置上有非零元素,例4-11 求稀疏矩阵ARRAY非零元素的平均值。,81,.386DATASEGMENTUSE16ARRAYDW123,-39,211,;稀疏矩阵非零元素RULEDW0001 0000 0011 0010B;“标尺”AVGDW?;非零元素的平均值SUMDD?;累加器DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,82,LEASI,ARRAY;装载非零元素地址指针MOVCX,16;设置计数器初值MOVBX,0;设置非零元素个数计数器初值 MOVSUM,0;设置累加器初值ONE:ROL

41、RULE,1;测试标尺JNCNEXT;该位置上为零元素,转NEXTMOVSX EAX,WORD PTRSI;取出一个元素,转换成32位有符号数ADDSUM,EAX;累加INCBX;统计非零元素个数ADDSI,2;修改地址指针NEXT:LOOP ONE;计数循环控制,83,CMPBX,0;有非零元素?JEEMPTY;无非零元素,转向“EMPTY”MOVDX,WORD PTRSUM+2MOVAX,WORD PTRSUM;取出32位累加值IDIVBX;计算平均值MOVAVG,AX;保存结果JMPEXITEMPTY:MOV AVG,-1;无非零元素,置平均值为-1EXIT:MOVAX,4C00HINT

42、21HCODEENDSENDSTART,84,4.3.3 条件循环,DATASEGMENTSTRINGDB“A string for testing.”,0LENTHDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX,例4-12 字符串STRING以代码0结束,求这个字符串的长度(字符个数)。,85,LEASI,STRING;装载字符串指针MOVCX,0;设置计数器初值TST:CMPBYTE PTR SI,0;比较JEDONE;字符串结束,转向DONE保存结果INCSI;修改指针INCCX;计数JMPTS

43、T;转向TST,继续循环DONE:MOVLENTH,CX;保存结果MOVAX,4C00HINT21HCODEENDSENDSTART,86,TST:CMPBYTE PTR SI,0;比较INCSI;修改指针INCCX;计数JNETST;转向TST,继续循环,错在哪里?运行结果会怎样?,87,LEASI,STRING-1;装载字符串指针MOVCX,-1;装载计数器初值TST:INCSI;修改指针INCCX;计数CMPBYTE PTR SI,0;比较JNETST;未结束,转TST继续循环MOVLENTH,CX;字符串结束,保存结果,比较一下,您喜欢这种风格吗?,88,DATASEGMENTARRA

44、YDW 1,2,3,4,5,6,-1AVRGDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX,例4-13 一维无符号字数组ARRAY以-1作为数组结束标志,求这个数组各元素的平均值。,89,LEABX,ARRAY;装载数组指针XORCX,CX;设置计数器初值XORDX,DXXORAX,AX;清累加器ONE:CMPWORD PTRBX,-1;判数组是否结束JEDONE;数组结束,转DONE,结束处理ADDAX,BX;累加ADCDX,0;保留进位ADDBX,2;修改指针INCCX;数组元素个数计数JMPONE

45、,90,DONE:JCXZNULL;数组元素个数为0,不能求平均值DIVCX;计算数组平均值MOVAVRG,AX;保存结果JMPEXITNULL:MOVAVRG,-1;数组为“空”,记平均值为-1EXIT:MOVAX,4C00HINT21HCODEENDSENDSTART,91,DATASEGMENTPOSITIONDW?STRINGDB“This is a string for example.”,0DATAENDSCODESEGMENTASSUME DS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX,例4-14 查找字母a在字符串STRING中第一次出现的位置,

46、如果未出现,置位置值为-1。,92,MOVSI,-1;SI用作字符串字符指针MOVCX,30;字符串长度30L0:INCSI;修改指针CMPSTRINGSI,a;一个字符与a进行比较LOOPNEL0;字符串未结束,未找到,继续JNENOTFOUND;未找到,转“NOTFOUND”MOVPOSITION,SI;保存位置值JMPEXITNOTFOUND:MOVPOSITION,-1;未找到,置位置值为-1EXIT:MOVAX,4C00HINT21HCODEENDSENDSTART,93,字符串内找到字符a:循环结束时ZF=1,SI内是字符的出 现位置(从0开始);字符串内未找到字符a:循环结束时Z

47、F=0,SI内是字符串 的长度-1(30-1=29)。,程序使用LOOPNE指令来控制循环,既有计数控制,又有条件控制。循环结束有两种可能性:,对于LOOPZ/LOOPE,LOOPNZ/LOOPNE控制的循环,一般应在循环结束后用条件转移指令分开这两种情况,分别处理。,94,DATASEGMENTC10DW10NUMDW?SIGNDB?ERRMSGDB 0DH,0AH,“Input a Decimal Digit(09):$”DATAENDSCODESEGMENTASSUME DS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX,例4-15 从键盘上输入一个有符号整数

48、(假设在-32768+32767 之间),将它转换成二进制补码,存入NUM单元。,95,MOVNUM,0;累加器清零MOVSIGN,0;符号预设为0(表示“+”)BEGIN:MOV AH,1INT21H;从键盘输入一个字符CMPAL,0DHJEEXIT;是回车,转EXIT,结束CMPAL,“+”JEINPUT;是“+”,转INPUT输入下一个字符CMPAL,“-”JNETWO;非符号字符,转TWO处理该字符MOVSIGN,1;是“-”,把符号标识为1(表示“-”),96,INPUT:MOV AH,1INT21H;从键盘再输入一个字符CMPAL,0DHJEDONE;是回车,转DONE,结束处理T

49、WO:CMPAL,“0”JBERRINPUT;输入非数字,显示出错信息CMPAL,“9”JAERRINPUT;输入非数字,显示出错信息MOVBX,AX;输入字符转移到BX寄存器ANDBX,000FH;转换成二进制数MOVAX,NUMMULC10ADDAX,BX;新输入数字拼接到已输入数字中MOVNUM,AXJMPINPUT;转INPUT,输入下一个字符,97,ERRINPUT:LEADX,ERRMSGMOVAH,9INT21H;显示出错信息JMPINPUT;转INPUT,重新输入DONE:CMPSIGN,0;判符号位JEEXITNEGNUM;符号为“-”,对已输入数求补EXIT:MOVAX,4

50、C00HINT21HCODEENDSENDSTART,98,4.3.4 多重循环,如果一个循环的循环体内包含了另一个循环,称这个循环为“多重循环”,各层循环可以是计数循环或者条件循环。,99,例4-16 打印20H7FH之间的ASCII字符表。,!“#$%?A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ a b c d e f g h I j k l m n o p q r s t u v w x y z|,100,打印格式:每行16个字符,共6行。打印1行:打印1个字符的过程重复16次,构成一个计数循环(内循环)。打印6行:打印1行

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号