您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > 第6章计算机的程序设计
第6章微型计算机的程序设计•6.1程序设计步骤137•6.2简单程序138•6.3分支程序140•6.4循环程序143•6.5子程序146•6.6查表程序150•习题在了解和熟悉了86系列指令系统的基础上,本章将介绍程序设计的一般过程,以及几种典型的程序形成的编写方法。6.1程序设计步骤程序是计算机命令(语句)的有序集合,当用计算机求解某些问题时需要编制程序。汇编语言程序设计归纳如下7个步骤:(1)分析问题:分析问题就是全面理解问题,要把解决问题所需条件、原始数据、输入和输出信息、运行速度要求、运算精度要求和结果形式等搞清楚。对较大问题的程序设计,一般还要用某种形式描绘一个“工艺”流程,以便于对整个问题的讨论和进行程序设计。“工艺”流程是指用表格、线条图、形象图或流程图等去描述问题或问题的物理过程。(2)建立数学模型:在对问题全面理解后,需要建立数学模型,这是把问题向计算机处理方式转化的第1步骤。建立数学模型是把问题数学化、公式化,有些问题比较直观,可不去讨论数学模型问题;有些问题符合某些公式或某些数学模型,可以直接利用;但有些问题没有对应的数学模型可以利用,需要建立一些近似数学模型模拟问题,由于计算机的运算速度很快,所以运算精度可以很高,近似运算往往可以达到理想精度。对初学者来说,主要是学习程序设计语法,复杂的数学模型可暂不去考虑。(3)确定算法:建立数学模型后,许多情况下还不能直接进行程序设计,需要确定符合计算机运算的算法。计算机的算法比较灵活,一般要优选逻辑简单、运算速度快、精度高的算法用于程序设计;此外,还要考虑占用内存空间小、编程容易等特点。算法可由计算机语言、日常生活语言、表格、自定义关系图或流程图等按计算机能够接受的方法进行描述,读者采用哪一种方式描述算法,有时还取决于习惯。(4)绘制程序流程图:程序流程图是用箭头线段、框图及菱形图等绘制的一种图。用它能够把程序内容直接描述出来,因此,它在程序设计中应用很普遍。程序流程图如图6.1所示。(5)内存空间分配:汇编语言的重要特点之一是能够直接用机器指令或伪指令为数据或代码程序分配内存空间,当然,在程序中没有指定分配存储空间时,系统会按约定方式分配存储空间。86系列存储器结构是分段的,如代码段、数据段、堆栈段或附加段,在程序设计时要考虑分段结构,要执行的程序段应设在当前段(活动段)中。程序在运行时所需要的工作单元应尽可能设在CPU寄存器中,这样存取速度快,而且操作方便。(6)编制程序与静态检查:编制程序就是按计算机语法规定书写计算机解决问题的过程。汇编语言编程应按指令系统和伪指令的语法规则进行,汇编语言符号虽然简单,但它的含意并不直观。初学者应多参照指令表或指令说明进行,以免给程序调试造成许多麻烦。编制程序首先关心的还是程序结构,它应是模块化和通用子程序结构,程序的结构要层次简单、清楚、易读、易维护为好。若程序运行时还要伴随人机对话过程,还应考虑用户在应用时操作简便,并有相应的提示给用户一些指导。静态检查是上机调试前的最后一步,只要细心,一般可以查出许多错误,这也就减少了程序调试时的许多麻烦。图6.1(7)程序调试(实验):程序调试是程序设计最后一步,也是非常重要的一步。没有调试过的程序,很难保证程序无错误,就是很熟练的程序员也不能保证这一点,因此,程序调试是不可缺省的。•程序调试是为了纠正错误。纠正错误的方法很多,例如在编辑、汇编、连接或用调试软件(如DEBUG)调试时都可以发现错误并设法修改程序。6.2简单程序这种程序的形式最简单,计算机执行程序的方式是“从头到尾”,逐条执行指令语句,直到程序结束,这是程序的最基本形式,任何程序都离不开这种形式。一般熟悉指令的读者,对于这类简单程序不用按上述7个步骤,而直接对给出的题目写出助记符程序清单。第5章讲述指令系统时所举的例子大多属于这种形式的程序。下面例子是为了熟悉上述程序设计步骤。【例6.1】用数据运算指令,对两个16位数做加法运算。这两个数从地址10050H开始连续存放,低位在小地址一端,结果放在这两个数之后。(1)分析题目:它是一个16位数相加的问题。在用加法指令时,必须要考虑低8位和低8位相加后产生的进位问题。(2)根据86系列指令系统,可以直接对累加器AX做字操作,但在低位相加后,会影响标志寄存器的进位位CF,所以,要用带进位的加法指令。(3)绘制程序流程图,如图6.2所示。图6.2(4)内存空间分配:被加数、加数及和在内存的空间分配见表6.1所示(见书第139页)。(5)编制的程序如下:MOVAX,1000HMOVDS,AX;DS=1000HMOVSI,50H;被加数指针SI=50HMOVDI,52H;加数指针DI=52HMOVBX,54H;和的指针BX=54HCLC;清CFXORAX,AX;清AXMOVAX,[SI];取一个字到AXADCAX,[DI];AX←AX+[DI]+CFMOV[BX],AX;存一个字到[BX]HLT;暂停【例6.2】将内存(10050)单元的内容拆成两段,每段4位,并将它们分别存入内存(10051)和(10052)单元。即(10050)单元中的低4位放入(10051)的低4位,(10050)单元中的高4位放入(10052)的低4位,而(10051)和(10052)的高4位均为零。(1)分析题目:这个题目所提出的任务在十六进制显示及(10050)中放着7AH,则题目要求就是把7AH拆成07H和0AH两部分,并把0AH放在(10051)单元,07H放在(10052)单元。我们在拆字时,想取得一个数的前4位和后4位可以用移位指令的方法,也可以用逻辑与一个0F0H(二进制为11110000)和逻辑与一个0FH(二进制为00001111)的办法。(2)根据指令系统中含有的指令,先取出该数用逻辑指令与上一个0FH,得到低4位,存入内存。再取出该数用移位指令逻辑右移SHR(见图5.10(c))4次,取得高4位,存入内存,即可完成此题目。(3)绘制程序流程图,如图6.3所示。(4)内存空间分配:把7AH拆成07H和0AH两部分,它们在内存空间的分配情况见表6.2所示(见书第140页)。图6.36.3分支程序分支程序是利用条件转移指令,使程序执行到某一指令后,根据条件(即上面运算的情况)是否满足,来改变程序执行的次序。这类程序使计算机有了判断作用。一般来说,它经常是先用比较指令或数据操作及位检测指令等来改变标志寄存器各个标志位。然后用条件转移指令进行分支。分支程序执行完后可以立即结束,也可以转到公共点结束,如图6.4所示。分支程序可以再分支,各分支程序之间没有对应关系,分支程序只要求在转移指令中给出目标地址,即可实现程序分支。在编写程序流程时,我们必定会用到菱形判断框。在编好流程图写助记符程序时,建议先按上下流程线写。写完上下流程线上的各框环节后,再写分支部分里的框框。图6.4【例6.3】求AX累加器和BX寄存器中两个无符号数之差的绝对值,结果放在内存(2800)单元中。(1)分析题目:此题目中,AX累加器和BX寄存器中的数是不知道的。对两个不知大小的数相减并求绝对值,显然应该先解决哪一个值稍大些,然后再用大数减小数的方法,才可求得绝对值。(2)根据指令系统中的比较指令,编出判断大小的环节,即可解决问题,图6.5即为该例题的程序流程图。图6.5(3)根据流程图编制程序如下:CLC;清除CFSUBAX,BX;AX←AX-BXJCAA;CF=1转AA去执行(即AX<BX时转移)MOVDI,2800H;结果指针DI=2800HMOV[DI],AX;结果送到2800H和2801H单元HLT;暂停AA:SUBBX,AX;BX←BX-AXMOVDI,2800HMOV[DI],BXHLT【例6.4】我们要编一个程序,从外设71H号中取一个数M,判断其值是否在10和20之间,即10≤M<20。如果M≥20H,则送0FFH给外设73H;如果M<10,则送00H给外设73H;如果10≤M<20,则送88H给外设73H。(1)分析题目:根据题意,我们可以看出这是一个需要两次判断M大小的问题。我们可以先判M是否大于10,再判M是否大于20。(2)根据解决问题的思路,我们先画出程序流程图,如图6.6所示。从图6.6的程序流程图来看,两个分支都要“回归”原程序。(3)编制的程序如下:START:INAL,71H;将71H端口的字节读入ALCLC;清除CFCMPAL,10;将AL的内容和10相比较JCLP1;小于10转LP1CMPAL,20;将AL的内容和20相比较JCLP2;10≤AL<20转LP2MOVBL,0FFH;将0FFH送入BL寄存器LP3:OUT73H,BL;将0FFH输出到73H端口HLT;暂停LP1:MOVBL,00JMPLP3LP2:MOVBL,88HJMPLP3图6.6在编写这种两次判断的问题时,应注意其次序,否则,有可能出现重复或矛盾。例如,上面的问题,两次判断可以安排成如图6.7所示的4种流程图形式。图6.7(c)中的这种方法,即是我们已经在例6.4中采用的方法。图6.7(b)的这种方法是等效于图6.7(c)的方法,因此也是可用的。但对于图6.7(a)的这种方法,由于已判断在LP0处的AL已大于等于20,再判是否大于10,就多此一举了,因此不可能出现LP2的流程,从而分不出中间值的情况。再看图6.7(d)的方法,在逻辑上就有矛盾,既然AL不大于等于10,处于LP1,也就不可能出现AL≥20的可能,因此加判是否大于20的环节是不合理的。所以说,在应用判断环节时,要十分注意把握住这些逻辑关系和标志位的意义。图6.76.4循环程序循环程序是强制CPU重复执行某一指令系列(程序段)的一种程序结构形式,凡是要重复执行的程序段都可以按循环结构设计。循环结构程序简化了程序清单书写形式,而且减少了占内存空间。值得注意的是循环程序并不简化程序执行过程,相反,增加了一些循环控制等环节,总的程序执行语句和时间会有所增加。循环程序一般由4部分组成:初始化、循环体、循环控制和循环结束处理,它的程序结构流程图如图6.8所示。其中各部分的内容如下:初始化:它完成建立循环次数计数器,设定变量和存放数据的内存地址指针(常用间址方式)的初值,装入暂存单元的初值等;(2)循环体:这是程序的处理部分;(3)循环控制:它包括修改变量和修改指针,为下一次循环做准备,以及修改循环计数器(计数器减1),判断循环次数到了没有。到了则结束循环;不到,则继续循环(即转移回去,再执行一次循环体)。(4)结束处理:它主要用来分析和存放程序的结果。循环程序分为单循环和多重循环,两重以上循环称为多重循环,如图6.9所示。循环控制方式有多种,如计数控制、条件控制、状态控制等。计数控制事先已知循环次数,每次循环加或减计数,并进行判定总次数以达到控制循环。条件控制事先不知循环次数,在执行循环时判定某种条件真假来达到控制循环的目的。状态控制可事先设定二进制位的状态,或由外界干预、测试得到的开关状态,决定循环与否。不管哪一种控制循环方式,最终都是要达到控制循环的目的。若考虑不周,会造成死循环,对这一点要注意。【例6.5】求两个多字节数之和。这两个数在10050H地址开始的内存单元中,连续存放,低位在小地址一端,结果放在这两个数之后。设这两个多字节数均为8个字节长。(1)分析题目:这是一个重复累加内存单元中数的问题,因此可以用循环程序形式解决。因为86系列指令系统可以16位处理,所以,循环次数是4次。(2)程序流程图如图6.10所示。图6.8图6.9图6.10(3)编制的程序如下:START:MOVAX,1000HMOVDS,AX;DS=1000HMOVSI,50H;第一个数指针SI=50HMOVDI,58H;第二个数指针DI=58HMOVBX,60H;结果指针BX=60HMOVCX,4;循环次数CX=4CLC;清进位CF=0AA:MOVAX,[SI];取一个字到AXADCAX,[DI];AX←AX+[DI]+CFMOV[BX],AX;存一个字到[BX]PUS
本文标题:第6章计算机的程序设计
链接地址:https://www.777doc.com/doc-3669248 .html