第5章 程序控制结构及其程序设计.ppt
《第5章 程序控制结构及其程序设计.ppt》由会员分享,可在线阅读,更多相关《第5章 程序控制结构及其程序设计.ppt(173页珍藏版)》请在三一办公上搜索。
1、第5章 程序控制结构及其程序设计,5.1 汇编语言程序设计概述 5.2 顺序程序设计 5.3 分支程序设计 5.4 循环程序设计 5.5 在实模式下发挥80386及其后继机型的优势 习题5,5.1 汇编语言程序设计概述,5.1.1 汇编语言程序设计的基本步骤 编制汇编语言程序的基本步骤如下:(1)分析问题,抽象出描述问题的数学模型。遇到一个题目,特别是一个较为复杂的题目,先要对其进行全面的分析,看它给出了什么条件,有什么特点,找出规律,归纳出数学模型。当然,也可能有些问题不用写出数学模型或写不出数学模型。,(2)确定算法。有了数学模型,或虽然没有数学模型但已把题目分析清楚了,就选择一个合适的算
2、法和适当的数据结构。如果没有可供选用的现成的算法和结构,就需要针对具体问题设计一个算法或结构。(3)绘制流程图。流程图就是用图形的方式把解决问题的算法直观地描述出来。对于一个比较复杂的问题,画出流程图,这有助于对问题的理解以及有助于编写出正确的程序。当然,如果算法比较简单,也可不画流程图。,(4)分配存储空间和工作单元。用汇编语言编写程序时,需要给程序中的变量指定内存单元地址或指定寄存器。(5)编写程序。要把题目中需要处理的数据合理地根据(2)、(3)、(4)步的工作,选用适合的指令,并按一定的语法规则编写相应的程序。(6)静态检查。静态检查就是用人工的方式检查程序是否有错误,包括算法错误和语
3、法错误等,如果有错误,及时改正过来。处理得好,静态检查能够发现和改正程序中的大部分错误。,(7)上机调试运行。任何程序必须经过调试,才能检查出解题目的是否正确以及程序是否符合设计思想。在调试程序的过程中,应该善于利用机器提供的调试工具(如DEBUG)和有效的其他工具软件来进行工作,经过反复的“运行发现错误改正错误运行”,才能得到正确的程序。这一点对初学者特别重要,它将给汇编语言编程提供很大的帮助。程序的编写和调试运行是学好汇编语言的重要手段。只有多编写程序和多调试运行程序,才能有效地提高编写和阅读程序的能力。,5.1.2 程序流程图 表示一个算法,可以用不同的方法。常用的有自然语言、传统流程图
4、、结构化流程图、伪代码和PAD图等。1.用自然语言表示算法 很多算法是用自然语言表示的,自然语言是指人们日常使用的语言。用自然语言表示算法通俗易懂,但文字冗长,容易出现“歧义性”。自然语言表示的含义往往不大严格,要根据上下文才能判断其正确的含义。假如有这样一句话:“王先生对刘先生说孩子考上了大学。”是王先生的孩子考上大学呢,还是刘先生的孩子考上大学呢?光从这句话本身难以判断。此外,用自然语言描述包含分支和循环的算法很不方便。因此,除了很简单的问题以外,一般程序设计不用自然语言描述算法。,2.流程图的组成 流程图是用一些图框表示各种操作。用图形表示算法,直观形象,易于理解。美国国家标准化协会AN
5、SI(American National Standard Institute)规定了一些常用的流程图图元(见图5.1),已被世界各国程序工作者普遍采用。借助于流程图可以清晰地把程序思路表达出来,有助于编写正确的程序。流程图对于程序设计人员,特别是初学者是一种非常有用的工具。流程图一般由6种成分组成,如图5.1所示。,图5.1 流程图的组成成分图,1)执行框(矩形框)图5.1中的方框,其作用是表示一段程序或一个模块的功能,对于结构化程序,一个执行框只有一个入口和一个出口。2)判别框(菱形框)图5.1中的菱形框,其作用是对一个给定的条件进行判断,根据给定的条件是否成立来决定如何执行其后的操作。它
6、有一个入口,两个出口,如图5.2所示。,图5.2 流程图的绘制示意,3)开始框和终止框 图5.1中的圆头方框表示程序的起始和终止。4)指向线 指向线表示程序执行的顺序。5)连接点 图5.1中小圆圈是连接点,用于将画在不同地方的流程线连接起来。如图5.2中有两个以为标志的连接点,它表示这两个点是互相连接在一起的。实际上它们是同一个点,只是当在纸张上画不下时才分开来画。用连接点,可以避免流程线的交叉或过长,使流程图清晰。,流程图是表示算法的较好工具。一个流程图包括以下几部分:(1)表示相应操作的框;(2)带箭头的流程线;(3)框内外必要的文字说明。绘制流程线不要忘记画箭头,因为它是反映流程执行的先
7、后次序的,如不画出箭头就难以判定各框的执行次序了。,用流程图表示算法直观、形象,能比较清楚地显示出各个框之间的逻辑关系。前一时期国内外计算机书刊都广泛使用这种流程图表示算法,但是,这种流程图占用篇幅较多,尤其当算法比较复杂时,画流程图既费时又不方便,在结构化程序设计方法推广之后,许多书刊已用N-S结构化流程图代替这种传统的流程图。但是每一个程序编制人员都应当熟练掌握传统流程图,做到会看会画。,3.三种基本结构和改进的流程图 1)传统流程图的弊端 传统的流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此,使用者可以不受限制地使流程随意地转来转去,使流程图变得毫无规律。阅读者要花很
8、大精力去追踪流程,使人难以理解算法的逻辑。这种情况如图5.3所示。这种如同乱麻一样的算法称为BS型算法,意为就像一碗面条(A Bowl of Spaghetti),乱无头绪。,图5.3 杂乱流程示意,这种算法不好,难以阅读,也难以修改,可靠性和可维护性难以保证。如果我们写出的算法能限制流程的无规律任意转向,如同一本书那样,由各章各节顺序组成,那样,阅读起来就很方便,从头到尾顺序地看下去即可。而如果一本书不是由各章节顺序组成,各章节内各节毫无规律地乱排,阅读这种书就很困难。,为了提高算法的质量,使算法的设计和阅读更方便,必须限制滥用箭头,即不允许无规律地使流程随意转向,只能顺序地进行下去。但是,
9、算法上难免会包含一些分支和循环,而不可能全部由一个一个框顺序组成。为了解决这个问题,人们设想,规定出几种基本结构,然后由这些基本结构按一定规律组成一个算法结构(如同用一些基本预制构件来搭成房屋一样),整个算法的结构是由上而下地将各个基本结构顺序排列起来的。如果能做到这一点,算法的质量就能得到保证和提高。,2)三种基本结构 1966年,BOHRA和JACOPINI提出了以下三种基本结构,用这三种基本结构作为表示一个良好算法的基本单元。(1)顺序结构。如图5.4所示,虚线框内是一个顺序结构。其中A和B两个框是顺序执行的。即在执行完A框所指定的操作后,必然接着执行B框所指定的操作。顺序结构是最简单的
10、一种基本结构。,图5.4 顺序结构图,(2)选择结构(也称选取结构或分支结构)。如图5.5所示,虚线框内是一个选择结构。此结构中必包含一个判断框。根据给定的条件P是否成立而选择执行A框或B框。请注意,无论P条件是否成立,只能执行A框或B框之一,不可能既执行A框又执行B框。无论走哪一条路径,在执行完A或B之后,都经过b点,然后脱离本选择结构。A或B两个框中可以有一个是空的,即不执行任何操作。(3)循环结构(又称重复结构)。循环结构指反复执行某一部分的操作,有当型(WHILE型)循环、直到型(UNTIL型)循环和计数型(FOR-NEXT)循环。,图5.5 选择结构图,4.结构化程序设计的特点 三种
11、基本循环结构的共同特点如下:(1)只有一个入口。(2)只有一个出口。尽管一个菱形判断框有两个出口,但由它构成的一个选择结构仍只有一个出口。不要将菱形框的出口和选择结构的出口混淆。(3)各功能框均可执行。结构内的每一部分都有机会被执行到,也就是说,对每一个框而言,都应当有一条从入口到出口的路径通过它。,(4)结构中无死循环。实践证明,由以上三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本结构内才允许存在分支、向前或向后的跳转。基本结构不一定只限于上面三种,只要具有上述四个特点的都可以作为基本结构。人们可以自己定义基本
12、结构,并由这些基本结构组成结构化程序。,5.2 顺序程序设计,在顺序程序结构中,完全按顺序逐条执行指令序列,这种情况在程序中大量存在,但仅由顺序结构构成的作为完整的程序则很少见。顺序结构的程序是最简单的程序。,【例5-1】将两个字节数据相加,并存放到一个结果单元中。DATASEGMENT AD1DB4CH;定义第1个加数 AD2DB25H;定义第2个加数 SUMDB?;定义结果单元 DATAENDS CODESEGMENT,ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,AD1;取出第1个加数 ADD AL,AD2;和第2个加数
13、相加 MOV SUM,AL;存放结果 MOV AH,4CH INT 21H;返回DOS CODE ENDS ENDSTART,【例5-2】两个32位数的乘法程序。.386DATA SEGMENTNUM1DD12345678H;定义第1个乘数NUM2DD5A4BEF06H;定义第2个乘数RESULTDD2 DUP(?);定义结果单元DATAENDSCODESEGMENT,ASSUME CS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX MOVEAX,NUM1;取出第1个乘数 MULNUM2;和第2个乘数相乘,MOVRESULT,EAX;存放结果的低4字节部分MOV
14、RESULT+4,EDX;存放结果的高4字节部分MOVAH,4CH;INT21H;返回DOSCODEENDS ENDSTART,【例5-3】将一个字节压缩BCD码转换为两个ASCII码。分析:一个字节的压缩BCD码就是用一个字节的二进制数表示两位十进制数,如十进制数96表示成压缩BCD码就是96H,转换成ASCII码就是把压缩BCD码表示的十进制数的高位和低位分开,并以ASCII码表示,即转换成39H和36H。,DATASEGMENTBCDBUFDB96H;定义1个字节的压缩BCD码ASCBUF DB2DUP(?);定义2个字节的结果单元DATA ENDSCODE SEGMENT ASSUME
15、 CS:CODE,DS:DATA,START:MOVAX,DATA MOVDS,AX MOV AL,BCDBUF;取出BCD码 MOVBL,AL;送BL暂存 MOVCL,4 SHRAL,CL;高4位变成低4位,高4位补0(96H09H)ADDAL,30H;变成ASCII码(39H),MOVASCBUF,AL;存储第1个ASCII码ANDBL,0FH;屏蔽掉高4位,只保留低4位(96H06H)ADDBL,30H;变成BCD码(36H)MOVASCBUF+1,BL;存储第2个码MOVAH,4CHINT21HCODE ENDSENDSTART,【例5-4】利用直接查表法完成将键盘输入的一位10进制数
16、(09)转换成对应的平方值并存放在SQRBUF单元中。(用P单步调试)分析:09的平方值分别为0、1、4、9、16、25、36、49、64、81。把平方值放在一起形成一个平方值表,根据输入的值和对应平方值所在单元地址之间的关系(表首地址加上输入的值),查出相应的平方值。,DATASEGMENTSQUTABDB0,1,4,9,16,25,36,49,64,81SQUBUFDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA,MOVDS,AXMOVBX,OFFSETSQUTAB;平方表首地址MOVAH,1INT21H;由键盘输入个数
17、,得到其ASCII码SUBAL,30H;由ASCII码得到相应的数XLAT;查表MOVSQUBUF,AL;存储结果,MOVAH,4CHINT21HCODEENDS END START,5.3 分支程序设计,5.3.1 分支程序的结构形式 分支程序结构可以有两种形式,如图5.6所示。不论哪一种形式,它们的共同特点是:运行方向是向前的,在某一种特定条件下,只能执行多个分支中的一个分支。,图5.6 分支程序的结构形式,SKIP,5.3.2 分支程序设计方法 程序的分支一般用条件转移指令来产生,利用条件转移指令不影响条件码的特性,可以连续使用条件转移指令使程序产生多个不同的分支如下例。【例5-5】在附
18、加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度,在AX中有一个无符号数,要求在数组中查找(AX)。如找到,则使CF=0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。,上述章节遇到的过多个表格查找的例子,大都使用顺序查找的方法。本例是一个已经排序的数组,可以采用折半查找法以提高查找效率。折半查找法先取有序数组的中间元素与查找值相比较。如相等则查找成功;如查找值大于中间元素,则再取高半部的中间元素与查找值相比较。如查找值小于中间元素,则再取低半部的中间元素与查找值相比较。如此重复直到查找成功或最终未找到该数为止。,折
19、半查找法的效率高于顺序查找法,对于长度为N的表格,顺序查找法平均要作N2次比较,而折半查找法的平均比较次数为lb N。所以,如果数组长度为100,则顺序查找法平均要作50次比较,而折半查找法平均作7次比较就可以了。在一个长度为N的有序数组R中,查找元素K的折半查找算法可描述如下:,(1)初始化被查找数组的首尾下标,LOWL,HIGHN。(2)若LOWHIGH,则查找失败,置CF1,退出程序。否则,计算中点:MID(LOW+HIGH)2。(3)K与中点元素RMID比较。若K=RMID则查找成功,程序结束;若KRMID,则转步骤(5)。(4)低半部分查找(Lower),HIGHMID-1,返回步骤
20、(2),继续查找。,(5)高半部分查找(Higher),LOWMID+1,返回步骤(2),继续查找。图5.7表示了折半查找算法的程序框图。给出的程序首先把查找值与数组的第一个元素和最后一个元素相比较,如果找到该数小于第一个元素或大于最后一个元素则结束查找,否则从SEARCH开始折半查找。SEARCH以前的工作在图5.7中未表示出来。折半查找算法的程序实现如程序清单所示。,图5.7 折半查找算法的程序框图,例5-5折半查找算法程序。DSEGSEGMENTLOW_IDW?HIGH_IDW?DSEGENDSCSEGSEGMENTASSUME CS:CSEG,DS:DSEG,ES:DSEG,B_SRC
21、HPROCNEARPUSHDS PUSHAXMOVAX,DSEGMOVDS,AXMOVES,AXPOPAXCMPAX,ES:DI+2JACHK_LAST,LEASI,ES:DI+2 JEEXIT STC JMPEXIT CHK_LAST:MOVSI,ES:DI SHLSI,1 ADDSI,DI CMPAX,ES:SI JBSEARCH JEEXIT,STC JMPEXITSEARCH:MOVLOW_I,1 MOVBX,ES:DI MOVHIGH_I,BX MOVBX,DI MID:MOVCX,LOW_I MOVDX,HIGH_I CMPCX,DX JANO_MATCH,ADDCX,DX SHR
22、CX,1 MOVSI,CX SHLSI,1COMPARE:CMPAX,ES:BX+SI JEEXIT JAHIGHER DECCX MOVHIGH_I,CX JMPMID,HIGHER:INCCX MOV LOW_I,CX JMPMIDNO_MATCH:STCEXIT:POPDS RET B_SRCH ENDPCSEG ENDS ENDB SRCH,若数组元素如下:LIST DW 12,11,22,33,44,55,66,77,88,99,111,222,333 如果要查找的数为(AX)=55。数组长度为12,第一次比较的是数组的第六个元素。因5533,所以第三次用高半部折半查找,比较的是第四
23、个元素44。因5544,所以第四次用高半部折半查找,比较的是第五个元素55。这样经过四次比较后,因查找成功而退出程序。,如果要查找的数为(AX)=57,则第一次比较的仍是第六个元素66。因5733,所以第三次用高半部折半查找,比较的是第四个元素44。因5744,所以第四次用高半部折半查找,比较的是第五个元素55,因5755,再用高半部折半查找时,因LOWHIGH而以查找失败退出程序。,可以看出,在这个例子中,同样用CMP指令以及条件转移指令产生两个或多个程序分支。当然,由于多数运算型指令置条件码,所以在条件转移指令之前并不一定要使用CMP或TEST指令,只要保证使用条件转移指令时的条件码符合要
24、求就可以了。以上多个例子都是既有分支结构又包括循环结构,实际上,多数程序都是各种程序结构的组合。而且,循环结构可以看作分支结构的一种特例,它只是多次走一个分支,只在满足循环结束条件时,走另一个分支罢了。,5.3.3 跳跃表法 分支程序的两种结构形式都可以用上面所述的方法来实现。此外,在实现CASE结构时,还可以使用跳跃表法,使程序能根据不同的条件转移到多个程序分支中去。下面举例说明。【例5-6】试根据AL寄存器中哪一位为1(从低位到高位)就把程序转移到8个不同的程序分支中去。,下面列出了用变址寻址方式实现跳跃表法的程序,还可以使用寄存器间接和基址变址寻址方式来达到同一目的,这三种方法并无实质的
25、区别,只是其中关键的JMP指令所用的寻址方式不同而已。跳跃表法是一种很有用的分支程序设计方法,应当通过例子掌握要领,灵活使用。用变址寻址方式实现跳跃表法的程序:,DATASEGMENTDATATABDW ROUTINE_1DW ROUTINE_2DW ROUTINE_3DW ROUTINE_4DW ROUTINE_5DW ROUTINE_6DW ROUTINE_7DW ROUTINE_8,DATA ENDS CODE SEGMENT MAIN PROCFARASSUME CS:CODE,DS:DATASTART:PUSHDS SUBBX,BX PUSH BX MOVBX,DATA MOVDS,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第5章 程序控制结构及其程序设计 程序控制 结构 及其 程序设计
链接地址:https://www.31ppt.com/p-2340669.html