第6章 结构化程序设计方法 课件.ppt

上传人:小飞机 文档编号:4040806 上传时间:2023-04-01 格式:PPT 页数:86 大小:746KB
返回 下载 相关 举报
第6章 结构化程序设计方法 课件.ppt_第1页
第1页 / 共86页
第6章 结构化程序设计方法 课件.ppt_第2页
第2页 / 共86页
第6章 结构化程序设计方法 课件.ppt_第3页
第3页 / 共86页
第6章 结构化程序设计方法 课件.ppt_第4页
第4页 / 共86页
第6章 结构化程序设计方法 课件.ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《第6章 结构化程序设计方法 课件.ppt》由会员分享,可在线阅读,更多相关《第6章 结构化程序设计方法 课件.ppt(86页珍藏版)》请在三一办公上搜索。

1、,2023/4/1,汇编语言程序设计,1,6.1 概述6.2 顺序程序设计6.3 分支程序设计6.4 循环程序设计,第6章 结构化程序设计方法,2023/4/1,汇编语言程序设计,2,第6章 结构化程序设计方法,(1)分析问题。对问题进行充分的分析,确定问题是什么,解决问题的步骤又是什么。(2)确定算法和数据结构。根据问题的分析结果,选择合适的解决方案即算法。(3)编制程序。将算法和数据结构等转换成程序代码。(4)调试程序。在计算机上实际运行,进行程序的测试和调整,直至获得预期的结果。,6.1 概述,程序设计的一般步骤,2023/4/1,汇编语言程序设计,3,6.1 概述,汇编语言程序设计的一

2、般步骤:,1.分析问题,抽象出描述问题的数学模型。2.确定解决问题的算法或算法思想。3.绘制流程图或结构图。4.分配存储空间及工作单元(包括寄存器)。5.逐条编写程序。6.静态检查。7.上机运行调试。,2023/4/1,汇编语言程序设计,4,(1)任何程序都可以由3种基本结构程序构成 顺序结构 分支(条件选择)结构 循环结构(2)每一个结构只有一个入口和一个出口,结构化程序设计原则:,6.1 概述,在汇编语言中,选择和循环结构必须通过比较或测试指令、算术逻辑指令、条件转移指令和循环指令等来完成。,2023/4/1,汇编语言程序设计,5,第6章 结构化程序设计方法,顺序程序结构是完全按顺序逐条执

3、行的指令序列。即指令指针IP顺序往下,不发生跳变。,6.2 顺序结构程序设计,在程序中大量以程序段出现。顺序程序设计是复杂程序设计的基础。,特点:无分支、无循环。,顺序程序举例,例1 将一字节数据从数据段的某个单元传送到另一单元。,DATASEGMENTFIRSTDB7AHSECONDDB?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,FIRSTMOVSECOND,ALMOVAH,4CHINT21HCODEENDSENDSTART,6.2 顺序结构程序设计,2023/4/1,汇编语言程序设计,6,2

4、023/4/1,汇编语言程序设计,7,6.2 顺序结构程序设计,DATASEGMENTBUFDB7AH,48HSUMDB?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,BUFADDAL,BUF+1MOVSUM,ALMOVAH,4CHINT21HCODEENDSENDSTART,例2 将存储器中的两个字节数相加,结果存入另一单元。,顺序程序举例,顺序程序举例,例3 按公式Y=XX-50编程。,:XDB45HYDW?:MOVAL,XMULALAUBAX,50MOVY,AX:,6.2 顺序结构程序设计,2

5、023/4/1,汇编语言程序设计,8,顺序程序举例,例4 将一字节压缩型BCD码转换为两个ASCII码。,:BCDBUFDB59HASCBUFDB2 DUP(?):MOVAL,BCDBUFMOVBL,ALMOVCL,4SHRBL,CLADDBL,30HMOVASCBUF,BLANDAL,0FHADDAL,30HMOVASCBUF+1,AL:,6.2 顺序结构程序设计,2023/4/1,汇编语言程序设计,9,顺序程序举例,例5 单字节压缩型BCD数的加法运算。(考虑进位),:ADB59HBDB81HCDB2 DUP(?):MOVAL,AADDAL,BDAAMOVC,ALLAHFANDAH,01H

6、MOVC+1,AH:,S Z _ A _ P _ C,6.2 顺序结构程序设计,2023/4/1,汇编语言程序设计,10,例6用查表法完成将从键盘输入的一位十进制数转换为对应的平方值。,:SQUDB0,1,4,9,16,25,36,49,64,81BUFDB?:MOVAH,1INT21HANDAL,OFHLEABX,SQUXLATMOVBUF,AL:,6.2 顺序结构程序设计,2023/4/1,汇编语言程序设计,11,2023/4/1,汇编语言程序设计,12,第6章 结构化程序设计方法,分支程序结构根据某些条件进行逻辑判断,当满足时进行某种处理;当不满足时进行另一种处理。,6.3 分支结构程序

7、设计,用条件转移指令实现,实现计算机的逻辑判断能力。,特定:只执行二分支或多分支中的一个分支。,一、分支结构的两种形式:,二分支结构 多分支结构,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,13,1.二分支结构,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,14,双分支程序相当于高级语言中的IF-THEN-ELSE语言。右图只对其中之一分支进行处理,也称为单分支结构。,2.多分支结构,多分支程序相当于高级语言中的CASE语句。,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,15,注意:在分支程序的两种结构中,无论条件是否满足,只能走一个分支,不

8、可能同时走两个分支。且程序只有一个入口一个出口。,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,16,1.二分支程序的一般结构一般要有产生条件、测试、定向、标号四个部分组成。也就是先通常用CMP、TEST、SUB、AND和移位指令等,影响标志位,再使用分支转移指令。如:CMPAX,0;条件JCNEXT;测试、定向:NEXT:NEGAX;标号,二、二分支程序设计,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,17,(1)单分支结构一:;程序段1:;产生条件JCC BRANCHS2::;程序段2:HLTBRANCH::;分支程序段:JMPS2,6.3 分支结构程序设

9、计,2023/4/1,汇编语言程序设计,18,(2)单分支结构二S1::;程序段1:;产生条件JCCS2;条件满足,转S2BRANCH::;分支程序段:S2::;程序段2:HLT;结束,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,19,MOVAL,XCMPAL,0JLBS2:MOVY,ALHLTB:NEGALJMPS2,MOVAL,XCMPAL,0JGES2NEGALS2:MOVY,ALHLT,例:求Y=|A|,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,20,(3)双分支结构一S1::程序段1:;产生条件JCC BRANCH:;分支程序段1:S2::;程序

10、段2:HLT;结束BRANCH::;分支程序段2:JMPS2,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,21,(4)双分支结构二S1::;程序段1:;产生条件JCC BRANCH:;分支程序段1:JMP S2BRANCH::;分支程序段2:S2:;程序段2:HLT,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,22,ANDAL,0FHCMPAL,10JLBADDAL,37HS2:MOVDL,ALMOVAH,2INT21HHLTB:ADDAL,30HJMPS2,ANDAL,0FHCMPAL,10JGEBADDAL,30HJMPS2B:ADDAL,37H S2:

11、MOVDL,ALMOVAH,2INT21HHLT,例:将AL中的一位十六进制数显示出来。,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,23,ANDAL,0FHCMPAL,10JLBADDAL,37HS2:MOVDL,ALMOVAH,2INT21HHLTB:ADDAL,30HJMPS2,改为单分支形式:ANDAL,0FHCMPAL,10JLBADDAL,7B:ADDAL,30H MOVDL,ALMOVAH,2INT21HHLT,例:将AL中的一位十六进制数显示出来。,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,24,2.双分支程序设计举例,SOURCEDB 1

12、2,78MAX DB?:MOV AL,SOURCE CMP AL,SOURCE+1 JNC BRANCH MOV AL,SOURCE+1BRANCH:MOV MAX,AL:,例1 比较两个无符号数的大小,把大数存入MAX单元。EP601.asm,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,25,BLOCKDB Search a largest character!COUNT EQU$-BLOCK,例3 设在一字符串中,找出ASCII值最大的显示。EP603.asm,LEA SI,BLOCK MOV CX,COUNT-1 MOV AL,SI INC SICOMP:CMPAL,S

13、I JA NEXT,MOVAL,SINEXT:INCSI LOOP COMP MOVDL,AL MOVAH,2 INT 21H,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,26,START:MOVAL,5DH MOV BL,AL MOV CL,4 SHR AL,CL CMP AL,0AHJL ADD_0 ADD AL,7ADD_0:ADD AL,30H MOV AH,2 MOV DL,AL INT 21H,例4 设将AL中的无符号数,按十六进制显示。,ANDBL,0FH CMP BL,0AH JL ADD_30H ADD BL,7ADD_30H:ADDBL,30H MOVDL

14、,BL MOV AH,2INT 21H MOV AH,4CH INT 21H,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,27,EP604.asm,例5判断变量X的值是否为“偶数”。,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,28,CODESEGMENTASSUMECS:CODESTART:JMPBEGINXDB?;被测试的数,汇编之前置入YESDB0AH,0DH,“Its a even number.”,0AH,0DH,$NODB0AH,0DH,“Its a odd number.”,0AH,0DH,$BEGIN:PUSHCSPOPDS,6.3 分支结构

15、程序设计,2023/4/1,汇编语言程序设计,29,TESTX,1;测试X的最低位,确定是否为偶数JZEVN;ZF=1,该数是偶数,转向“EVN”ODD:LEADX,NO;否则,该数是奇数MOVAH,9INT21H;输出奇数的相关信息JMPDONE;跳过程序“EVN”EVN:LEADX,YESMOVAH,9INT21H;输出偶数的相关信息DONE:MOVAX,4C00HINT21HCODEENDSENDSTART,如果两个“平行”分支有相同的处理过程,可以把它们“合并”:,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,30,TESTX,1;测试X的最低位,确定是否为偶数JZEV

16、N;ZF=1,该数是偶数,转向“EVN”ODD:LEA DX,NO;否则,该数是奇数JMP DONE;跳过程序“EVN”EVN:LEA DX,YES;该数是偶数DONE:MOVAH,9INT21H;输出该数的相关信息MOV AX,4C00H,A DB 12B DB 78:MOV AL,A CMP B,AL JAE BGA MOV DL,A MOV DH,B JMP COM,例5 设A、B两单元各有一个无符号数,要求根据大小显示“AB”或“BA”。EP605.asm,BGA:MOV DL,B MOV DH,ACOM:MOV AH,2 INT 21H MOV DL,INT 21H MOV DL,D

17、H INT 21H,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,31,三、多分支程序设计,1.复合选择结构2.地址表法3.跳转表法4.逻辑分解法,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,32,用多条条件转移指令组合实现。一次判断产生两条分支,N次判断产生N+1条分支。,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,33,1.复合选择结构,例6 符号函数。EP606.asm1X0Y=0X=0-1X0,X DB 89HY DB?:MOVAL,X CMP AL,0 JGE BIGPR MOV Y,0FFH,JMPCOMBIGPR:JE EQUP

18、R MOVY,1 JMPCOMEQUPR:MOVY,0COM:MOVAH,4CH INT21H,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,34,方法1,逐项排除,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,35,CMPX,0 JGPLUS JEZEROMINUS:MOVY,-1 JMPDONEPLUS:MOVY,1 JMPDONEZERO:MOVY,0DONE:,方法2,逐项确认,例7从键盘上输入一个小写字母,显示该字母的前导和后继。EP607.asm,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,36,DATASEGMENTPROMPT

19、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,$DATAENDS,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,37,CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:LEADX,PROMPTMOVAH,9INT21H;输出提示信息MOVAH,1

20、INT21H;输入一个字符CMPAL,a;输入正确性检查JBERRORCMPAL,zJAERROR,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,38,MOVBL,AL;计算“前导”字母DECBLCMPBL,aJBSKIP1;“前导”非字母,跳过MOVPREV,BL;保存“前导”字母SKIP1:INCAL;计算“后继”字母CMPAL,zJASKIP2;“后继”非字母,跳过MOVSUCC,AL;“后继”为字母,保存SKIP2:LEADX,BUF;输出“前导”和“后继”字母MOVAH,09HINT21H,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,39,JMPEX

21、IT;跳过出错处理程序ERROR:LEA DX,ERR-MSG;显示出错信息 MOVAH,09HINT21HJMPINPUT;要求重新输入EXIT:MOVAX,4C00H;返回OSINT21HCODEENDSENDSTART,2.地址表法其设计思想是在数据段中定义一张地址表,将各个分支程序段的入口地址放入表中,然后根据各分支程序的编号,在地址表中找出转向某个分支程序的入口地址。表地址=地址表首址+编号*2,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,40,例:设有0,1,N,共N+1个分支程序,各分支程序的入口分别为ADD0,ADD1,ADDN。,DATASEGMENTNUM

22、DBNADTABDWADD0,ADD1,ADDNDATAENDS,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,41,:MOVAH,0MOVAL,NUMADDAX,AXMOVSI,AXMOVBX,ADTABSIJMPNEAR PTR BX:,代码段中:,:ADDR0:ADDR1:ADDRN:,6.3 分支结构程序设计,2023/4/1,汇编语言程序设计,42,3.转移表法与地址表法类似,不同的是表中建立的是转移指令表。,BRATAB:JMPSHORT M0JMPSHORT M1:JMPSHORT M9,M0:M1:M9:,6.3 分支结构程序设计,2023/4/1,汇编语言程序

23、设计,43,2023/4/1,汇编语言程序设计,44,第6章 结构化程序设计方法,循环结构也称“重复结构”,重复执行一组指令若干次,用有限长度的程序完成大量的处理任务,实现计算机的重复操作。,6.4循环程序设计,几乎所有的应用程序中都离不开循环结构,一、循环程序的结构,2023/4/1,汇编语言程序设计,45,(1)初始化部分:为循环做准备,如累加器清零,设置地址指针和计数器的初始值等。(2)工作部分:实现循环的基本操作,也就是需要重复执行的一段程序。(3)修改部分:修改指针、计数器的值,为下一次循环做准备。(4)控制部分:判断循环条件,结束循环或继续循环。,1.循环一般由以下4个部分组成:,

24、6.4 循环程序设计,2023/4/1,汇编语言程序设计,46,(1)先判断后循环,即WHILE循环。,2.根据循环结束判断在循环中的位置,有以下两种结构的循环:,(2)先循环后判断,即DO-WHILE循环或DO-UNTIL循环。,循环次数最少为0次,循环次数最少为1次,6.4 循环程序设计,2023/4/1,汇编语言程序设计,47,6.4 循环程序设计,2023/4/1,汇编语言程序设计,48,循环的次数已知,常用CX寄存器(也可以用其他寄存器或存储器单元)记录循环的次数(称为“循环计数器”)。进行减法计数时,循环计数器的初值直接设为循环次数,每循环一次将计数器减1,计数器减为0时,循环结束

25、。,3.按照循环结束的条件,有以下两类循环:,(1)计数循环:,6.4 循环程序设计,2023/4/1,汇编语言程序设计,49,循环的次数事先并不确定,每次循环开始前或结束后测试某个条件,根据这个条件是否满足来决定是否继续下一次循环。,(2)条件循环:,6.4 循环程序设计,条件循环更具普遍意义,4.循环控制条件的选择,(1)循环次数已知:循环次数作为循环控制条件,用LOOP指令完成。(2)循环次数已知,但可能会提前结束:可用LOOPZ、LOOPNZ指令完成。(3)循环次数未知:根据具体的情况找出循环结束条件,用条件转移、JMP等完成。,2023/4/1,汇编语言程序设计,50,6.4 循环程

26、序设计,2023/4/1,汇编语言程序设计,51,计数循环是基本的循环组织方式,用循环计数器的值来控制循环,有时候也可以结合其它条件共同控制。,二、计数循环:,LOOPLOOPZ/LOOPELOOPNZ/LOOPNE,6.4 循环程序设计,:START:MOVBX,1;项MOVAX,0;部分和MOVCX,100;循环次数AGAIN:ADDAX,BX;循环工作部分INCBX;修改部分LOOPAGAIN;循环控制MOVS,AX;存结果:,例1 计算S=1+2+3+100,倒计数法,2023/4/1,汇编语言程序设计,52,6.4 循环程序设计,:MOVCX,2801;初始化DELAY:LOOPDE

27、LAY;循环体、循环控制:,例2 延时程序(10ms),2023/4/1,汇编语言程序设计,53,6.4 循环程序设计,2023/4/1,汇编语言程序设计,54,CRLFMACROMOVAH,2MOVDL,0DHINT 21HMOVDL,0AHINT 21HENDM,例3 从键盘上输入一个字符串(不超过80个字符),将它逆序后输出。,6.4 循环程序设计,2023/4/1,汇编语言程序设计,55,DATASEGMENTBUFFERDB81,?,81 DUP(?)MESSDB0AH,0DH,Input a string please:$DATAENDSCODESEGMENTASSUME CS:C

28、ODE,DS:DATASTART:MOV AX,DATAMOVDS,AXLEADX,MESSMOVAH,09HINT21H;输出提示信息MOVAH,0AHLEADX,BUFFERINT21H;输入字符串,6.4 循环程序设计,2023/4/1,汇编语言程序设计,56,CRLFLEABX,BUFFER;缓冲区首地址送BXMOVCL,BUFFER+1MOVCH,0;输入字符个数送CX(循环次数)ADDBX,CXINCBX;计算字符串末地址送BX(指针)DISP:MOV DL,BXMOVAH,02HINT21H;逆序输出一个字符DECBX;修改指针LOOPDISP;计数循环CRLF;输出换行、回车,

29、结束本行MOVAX,4C00HINT21HCODEENDSENDSTART,6.4 循环程序设计,例4P161例5.1把BX寄存器中的二进制数以十六进制的形式在屏幕上显示出来。Hb0501.asm,上述例子都是倒计数法,正计数法一般不用。,2023/4/1,汇编语言程序设计,57,6.4 循环程序设计,2023/4/1,汇编语言程序设计,58,在循环次数未知的情况下,一般采用条件控制法编写循环程序。,三、条件循环:,6.4 循环程序设计,例5计算S=1+23+34+45+N(N+1)+,直到N(N+1)项大于200为止。,:START:MOVDX,1;和MOVBL,2;NNEXT:MOVAL,

30、BL;INCBL;N+1MULBL;N(N+1)项ADDDX,AX;部分和CMPAX,200;循环控制JNANEXT;MOVS,DX:,2023/4/1,汇编语言程序设计,59,6.4 循环程序设计,2023/4/1,汇编语言程序设计,60,DATASEGMENTSTRINGDB A string for testing.,0LENTHDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX,例7字符串STRING以代码0结束,求这个字符串的长度(字符个数)。,6.4 循环程序设计,2023/4/1,汇编语言程

31、序设计,61,LEA SI,STRING;装载字符串指针MOV CX,0;设置计数器初值TST:CMPBYTE PTR SI,0;比较JEDONE;串结束,转向DONE保存结果INCSI;修改指针INCCX;计数JMPTST;转向TST,继续循环DONE:MOV LENTH,CX;保存结果MOV AX,4C00HINT 21HCODE ENDSEND START,6.4 循环程序设计,2023/4/1,汇编语言程序设计,62,LEASI,STRING-1;装载字符串指针MOVCX,-1;装载计数器初值TST:INCSI;修改指针INCCX;计数CMPBYTE PTR SI,0;比较JNETST

32、;未结束,转TST继续循环MOVLENTH,CX;字符串结束,保存结果,比较一下,这种风格也很不错:,6.4 循环程序设计,2023/4/1,汇编语言程序设计,63,DATASEGMENTARRAYDW 1,2,3,4,5,6,-1AVRGDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX,例8一维无符号字数组ARRAY以-1作为数组结束标志,求这个数组各元素的平均值。,6.4 循环程序设计,2023/4/1,汇编语言程序设计,64,LEABX,ARRAY;装载数组指针XORCX,CX;设置计数器初值XOR

33、DX,DXXORAX,AX;清累加器ONE:CMPWORD PTRBX,-1;判数组是否结束JEDONE;数组结束,转DONE,结束处理ADDAX,BX;累加ADCDX,0;保留进位ADDBX,2;修改指针INCCX;数组元素个数计数JMPONE,6.4 循环程序设计,2023/4/1,汇编语言程序设计,65,DONE:JCXZNULL;数组元素个数为0,;不能求平均值DIVCX;计算数组平均值MOVAVRG,AX;保存结果JMPEXITNULL:MOVAVRG,-1;数组为“空”,记;平均值为-1EXIT:MOVAX,4C00HINT21HCODEENDSENDSTART,6.4 循环程序设

34、计,2023/4/1,汇编语言程序设计,66,DATASEGMENTPOSITIONDW?STRINGDB This is a string for example.,0DATAENDSCODESEGMENTASSUME DS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX,例9查找字母a在字符串STRING中第一次出现的位置,如果未出现,置位置值为-1。,6.4 循环程序设计,2023/4/1,汇编语言程序设计,67,MOVSI,-1;SI用作字符串字符指针MOVCX,30;字符串长度30L0:INCSI;修改指针CMPSTRINGSI,a;一个字符与a进行比较LO

35、OPNEL0;字符串未结束,未找到,继续JNENOTFOUND;未找到,转“NOTFOUND”MOVPOSITION,SI;保存位置值JMPEXITNOTFOUND:MOVPOSITION,-1;未找到,置位置值为-1EXIT:MOVAX,4C00HINT21HCODE ENDSENDSTART,6.4 循环程序设计,2023/4/1,汇编语言程序设计,68,(1)字符串内找到字符a:循环结束时ZF=1,SI内是字符的出现位置(从0开始);(2)字符串内未找到字符a:循环结束时ZF=0,SI内是字符串的长度-1(30-1=29)。,6.4 循环程序设计,程序使用LOOPNE指令来控制循环,既有

36、计数控制,又有条件控制。循环结束有两种可能性:,所以,对于LOOPZ/LOOPE,LOOPNZ/LOOPNE控制的循环,一般应在循环结束后用条件转移指令分这两种情况,分别处理。,2023/4/1,汇编语言程序设计,69,DATASEGMENTC10DW10NUMDW?SIGNDB?ERRMSGDB 0DH,0AH,Input a Decimal Digit(09):$DATAENDSCODESEGMENTASSUME DS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX,例10从键盘上输入一个有符号整数(假设在-32768+32767 之间),将它转换成二进制补码,存

37、入NUM单元。,6.4 循环程序设计,2023/4/1,汇编语言程序设计,70,MOVNUM,0;累加器清零MOVSIGN,0;符号预设为0(表示“+”)BEGIN:MOV AH,1INT21H;从键盘输入一个字符CMPAL,0DHJEEXIT;是回车,转EXIT,结束CMPAL,“+”JEINPUT;是“+”,转INPUT输入下一个字符CMPAL,“-”JNETWO;非符号字符,转TWO处理该字符MOVSIGN,1;是“-”,把符号标识为1(表示“-”),6.4 循环程序设计,2023/4/1,汇编语言程序设计,71,INPUT:MOV AH,1INT21H;从键盘再输入一个字符CMPAL,

38、0DHJEDONE;是回车,转DONE,结束处理TWO:CMPAL,“0”JBERRINPUT;输入非数字,显示出错信息CMPAL,“9”JAERRINPUT;输入非数字,显示出错信息MOVBX,AX;输入字符转移到BX寄存器ANDBX,000FH;转换成二进制数MOVAX,NUMMULC10ADDAX,BX;新输入数字拼接到已输入数字中MOVNUM,AXJMPINPUT;转INPUT,输入下一个字符,6.4 循环程序设计,2023/4/1,汇编语言程序设计,72,ERRINPUT:LEADX,ERRMSG MOVAH,9 INT21H;显示出错信息 JMPINPUT;转INPUT,重新输入D

39、ONE:CMPSIGN,0;判符号位 JEEXIT NEGNUM;符号为“-”,对已输入数求补EXIT:MOVAX,4C00H INT21HCODE ENDS ENDSTART,6.4 循环程序设计,:MOVCX,0;初始,CX为计数器LOP:ANDAX,AX;先判断,TEST AX,0FFFFH也可JZSTOP;AX为0,结束循环SALAX,1JNCNODINCCX;计数,INC CLNOD:JMPLOPSTOP:HLT,例11 AX寄存器中的一个16位二进制数,编程统计其中1的个数,结果存入CL中。,先判断后循环的例子,2023/4/1,汇编语言程序设计,73,6.4 循环程序设计,优点:

40、减少循环次数,例12 P163例5.2在ADD单元存放着数Y的地址,试编程把Y中1的个数存入COUNT单元。Hb0502.asm,2023/4/1,汇编语言程序设计,74,6.4 循环程序设计,利用变址寄存器或基址寄存器(SI、DI、BX、BP),有间接寻址、变址寻址等方式访问数据。每循环一次,修改一次变址或基址寄存器,指向下一个数据。,循环程序设计根据算法需要可以采用多种寻址方式访问数据。,2023/4/1,汇编语言程序设计,75,6.4 循环程序设计,例1 找最大(小)数。Maxmin.asm例2 多字节相加(减)的完整汇编程序,要求能显示结果。Multiadd.asm注意:相加结果的每位

41、=9。,2023/4/1,汇编语言程序设计,76,6.4 循环程序设计,例3 编程将以S1为起始地址的26个字母,依次送到以S2为起始地址的连续字节存储单元中。方法一、采用寄存器间接寻址方式编程。Movchar1.asm方法二、采用变址寻址方式编程。Movchar2.asm方法三、采用基址+变址寻址方式编程。Movchar3.asm方法四、采用串操作指令编程。Movchar4.asm,2023/4/1,汇编语言程序设计,77,6.4 循环程序设计,例4 在BUFFER为首地址的单元开始,存放了N个单字节的有符号数,编程统计其中负数的个数。Cminus.asm,2023/4/1,汇编语言程序设计

42、,78,6.4 循环程序设计,多重循环在循环程序的循环体中又包含着循环结构。双重循环的一般结构:,四、多重循环,2023/4/1,汇编语言程序设计,79,6.4 循环程序设计,6.4 循环程序设计,例1 在内存DATA开始存放100个字节数据,编程统计这些数据内“0”和“1”的个数相等的数据个数,并存入NUMB单元。Count01.asm,2023/4/1,汇编语言程序设计,81,6.4 循环程序设计,例2 从内存BUF单元开始存放有若干字节的数据块,编程统计该数据块中,所有位为“1”的个数。Count1.asm,2023/4/1,汇编语言程序设计,82,6.4 循环程序设计,例3 用双重循环

43、编写软件延时子程序。SOFTDLYPROCMOVBL,100DELAY:MOVCX,2801;内循环,延时10msWAIT:LOOPWAITDECBLJNCDELAYRETSOFTDLYENDP,2023/4/1,汇编语言程序设计,83,6.4 循环程序设计,主要:汇编语言程序设计的一般步骤顺序、分支、循环程序的基本结构和程序设计方法。重点:双分支程序中的产生条件和条件转移指令。循环程序由初始化、循环体和循环控制三个部分组成。掌握循环程序中的计数法和条件法。其它:多分支程序的实现方法;多重循环结构。,第6章小结,2023/4/1,汇编语言程序设计,84,第6章习题,2023/4/1,汇编语言程序设计,85,第一次:6.1 6.2 6.3第二次:6.4 6.5 6.8 选做:6.15 6.20,谢 谢!,2023/4/1,汇编语言程序设计,86,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号