第五章 程序设计的基本方法Word文件下载.docx

上传人:b****6 文档编号:20696786 上传时间:2023-01-25 格式:DOCX 页数:31 大小:102.42KB
下载 相关 举报
第五章 程序设计的基本方法Word文件下载.docx_第1页
第1页 / 共31页
第五章 程序设计的基本方法Word文件下载.docx_第2页
第2页 / 共31页
第五章 程序设计的基本方法Word文件下载.docx_第3页
第3页 / 共31页
第五章 程序设计的基本方法Word文件下载.docx_第4页
第4页 / 共31页
第五章 程序设计的基本方法Word文件下载.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

第五章 程序设计的基本方法Word文件下载.docx

《第五章 程序设计的基本方法Word文件下载.docx》由会员分享,可在线阅读,更多相关《第五章 程序设计的基本方法Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。

第五章 程序设计的基本方法Word文件下载.docx

若有关系,应该根据每个条件或算式产生相应的反应。

2.输出定义

(1)输出量是何种信息?

是数据,还是控制命令或参数。

(2)CPU如何知道输出设备已准备好?

(3)输出信息是否需锁存?

外部设备要求CPU的输出保持多长时间?

(4)输出信息多长时间变化一次,外部设备如何知道这种变化?

是否能及时反应?

(5)输出信息是否为数据序列,输出顺序是否有严格的限制,是否需要采用校验措施?

(6)该输出同其它输入或输出是否有关系?

(二)系统存储器的说明

存储器是存放程序和数据的器件,软件设计者必须注意以下问题:

(1)本微计算机应用系统是否采取存储器掉电保护措施。

(2)系统存储器资源如何管理,工作区域如何划分。

(3)采用何种软件结构最容易做到只改换一两片ROM就能改变系统的软件功能。

(4)如何使用只读存储器。

软件设计者对上述问题的考虑和规划,就构成系统存储器的说明。

(三)程序处理阶段的说明

从输入数据到送出结果之间的阶段称为处理阶段,此阶段中需要涉及精确的算术逻辑运算和一些监督控制功能。

任何应用系统都要涉及到CPU指令系统中的算术、逻辑运算及位操作功能,因此,在进行系统定义时,设计者必须细心地考虑本应用系统中算术逻辑运算的比重,采用的基本算法,所用的指令类型,指令出现的概率,结果的精确程度,处理时间的限制,内存空间的节省等问题。

根据这些情况,就可以决定是否需要建立相应的功能程序块,如计算三角函数、输入/输出的代码转换器。

对于一个普通的应用系统,除一般的算术逻辑运算操作外,CPU还必须完成某

些纯属监督控制的功能。

这些功能模块通常放在监控程序的软件包里,在IBMPC机中就是DOS和BIOS的功能调用。

(四)出错处理和操作的说明

出错处理是许多应用系统的一个重要内容。

因此,设计者应在系统定义阶段提出如下一些主要问题:

(l)可能发生什么类型的错误,哪些错误是最经常出现的错误?

一般情况下,在需要由人操作的系统中,人为差错是最容易出现的,其次就是通信传输差错。

(2)系统如何才能以最低限度的时间和数据损失来排除错误。

对错误处理的结果,以何种形式记录在案或显示?

(3)哪些错误或故障会引起相同的不正常现象?

如何区分这些错误或故障。

(4)为了方便查找故障源,是否需要研制专用测试程序和诊断程序。

此外,由于许多应用系统涉及到人和机器的相互作用,因此还必须考虑操作因素。

如采用哪种输入过程最适合操作人员的习惯;

操作步骤是否简单易懂;

操作出错时,如何提醒操作人员;

显示方式是否使操作人员容易阅读和理解等。

系统定义的完成,就初步构成了一个微计算机应用系统的总概念,确定了系统设计的任务和要求。

二、程序设计

程序设计的任务是制定计算机程序的纲要,用以表明该程序将执行系统定义所规定的任务。

在这阶段要利用一些很容易转变成程序的方法对任务作出描述。

常用的方法有流程图法,模块程序设计,结构化程序设计和自顶向下程序设计等。

流程图法是最早使用的方法,直观,设计者可借以直接观察整个系统,了解各部分之间的关系。

但是,流程图只能表示出程序的结构,而表示不出数据的组织结构或输入/输出模块的结构,对硬件或定时均无帮助,一般只用于简单问题的程序设计。

对大而复杂的程序一般都要采用把任务分小,即划分为模块。

划分时自顶向下,由租到细,然后对于各模块的设计,将根据任务的性质,选用适合的程序结构来实现,这种方法称为模块化程序设计,是现今程序设计的主流方法。

三、编码

所谓编码就是选择一种合适的程序设计语言来实现各模块的功能。

微计算机原理中选用以CPU指令系统和汇编程序为基础的汇编语言进行程序设计,不仅可以提高工作系统的运行速度,提高内存利用率,而且可以明确地作用于机器的各个部件,是一种易于了解系统软硬件配合工作的程序设计语言。

四、查错和调试

查错和调试是软件研制很关键的一步。

各个模块可以独立编写和调试,调试完后,再把它们连接起来形成一个完整的程序。

关于模块的查错,调试及连接的工具软件及使用方法已述于§

4.6。

有些微机应用系统的软件需要存放在ROM或EPROM中,在存入之前必须进行查错,调试和仿真运行后方可写入。

五、文件编制

文件编制是以用户和维护人员最为合适的形式来描述程序,它不仅有助于设计者进行查错和测试,而且对程序的使用,维护和扩充也是必不可少的。

一个应用软件的完整文件可涉及下列内容:

(1)总流程图;

(2)程序功能的书面说明;

(3)所有参量的定义清单;

(4)存储器分配图;

(5)完整的程序清单和注释;

(6)测试计划和测试结果的说明。

实际上,文件编制工作贯穿着软件研制的全过程。

各个阶段都应注意收集和整理有关资料,最后的编制工作只是把各个阶段的文件连贯起来,并加以完善而已。

六、维护和再设计

这是指对软件进行修复,改进和扩充。

一个好的应用软件,不仅要能够执行规定的任务,而且在开始设计时,就应该考虑到维护和再设计的方便,使它具有足够的灵活性,可扩充性和可移植性。

因为,一方面可能会发生各种现场问题,须排除故障;

另一方面用户往往由于环境或技术业务的变化,提出比原计划更多的要求,因而都需要对原有软件进行改进和扩充,并编入新的EPROM中,以适应新情况的需要。

经过以上三个阶段,系统的设计和软件调试就基本完成了。

以上,我们介绍了开发一个应用系统的完整步骤,那么,对于我们学习汇编语言编程,应注意哪些方面呢?

首先,我们提出一个什么是"

好程序"

的简单明了的标准:

1.满足正确性的要求,其功能符合要求。

2.结构清晰:

包括程序流程结构,及模块和子程序的划分。

3.算法的合理实现:

正确、高效。

我们应如何编写这样的程序呢?

应该有如下步骤:

 

1.首先要分析问题,弄清需求:

∙ 

程序要完成什么功能

功能完成上有什么要求(例如显示格式、硬件时序等等)

有哪些数据(包括原始的、中间的、最后的),数据的类型是怎样的

已有系统的基础有哪些

2.确定算法,绘制流程图

包括确定数据结构及数据定义、分配存储单元及工作单元

3.编程

4.静态检查与调试

5.文档管理

注意,文档的编写应惯穿整个过程,最后还需要总结。

6.维护与再设计

汇编语言程序设计,相对于高级语言程序设计,有一些不同的特点:

1.在算法的实现上,由于汇编语言指令功能较弱,因此考虑的问题要细小的多,层次要低得多。

比如,一个算术表达式,高级语言只需要一条语句就能实现,汇编语言却可能要一个一个进行运算。

这就要求我们对指令集功能既要有一个较全面的宏观上的把握,又要对指令的执行有一个微观上的理解,如标志位、寻址方式、操作数类型、寄存器用法等等。

2.变量的具体存储格式(如实数、整数、有符号数、无符号数)需要搞得很清楚,还要进行具体的内存分配。

3.在很多汇编语言程序中,需要考虑时序问题,因为涉及到硬件的控制。

5.2 

模块化程序设计(ModularProgramming)

把一个程序分成具有多个明确任务的程序模块,分别进行编写和调试,最后再把它们连接在一起,形成一个完成总任务的完整程序,这种程序设计方式叫模块程序设计。

这种方法的优点如下:

(l)单个程序模块易于编写,调试和修改;

(2)便于分工,可由多个程序员编写、调试,有利于加快工作速度;

(3)程序易读性好;

(4)程序的修改可局部化进行;

(5)频繁使用的功能可以编制成模块存在库里供多个任务使用。

1.模块的划分与模块的表示

模块化程序设计的关键是模块的划分。

划分模块是一个自顶向下(TOP_DOWN)的程序设计过程。

主模块是一个总控模块,划分模块的第一步是确定需要几个主要子模块(又称一级子模块),主要子模块通常包括完成输入任务,完成输出任务和进行计算处理任务等一些子模块。

在划分模块的过程中,应该弄清楚每个模块的功能,数据结构及相互之间的关系。

第二步,对主要子模块的任务再细化,把一些专用的子任务再划分给下一级的子模块去完成(这是第二级子模块),当然也要弄清楚它们相互间的关系,……重复上述过程,至细化到程序已经分成易于理解和易于实现的小块为止。

划分的模块采用层次图和模块说明来表示:

层次图是一个方块图,用来表示模块和子模块之间的关系,图5-2是一个层次图的例子,从图中可以看出它所表示的各模块之间的从属关系。

这里的生模块可以调用~级子模块的A、B、C,而这些一级子模块又可以分别调用它下一层的E、B、D、F、G等二级子模块。

二级子模块还可调用再下一级的三级子模块D、M等。

图中还可看到一个子模块可以出现在层次图的不同层次上,从属于多个模块,如B、D子模块。

模块说明中应包含对模块功能,所用基本算法,模块的人口参数和出口参数,以及它们的数据结构和调用情况等,还应该说明程序中哪些数据应该放在公共数据区可以由所有模块访问,哪些数据则应该在有直接从属关系的模块间传送等。

一般来说,有了层次图和各个模块的模块说明后,划分模块的工作就完成了。

2.划分模块的原则

划分模块必须根据任务确定,模块的划分具有相当的灵活性,但也并不是说灵活得可以任意划分。

划分时应有一些指导原则,这些原则大概可归纳为以下几个方面:

1.每个模块应该具有独立的功能,能产生一种明确的结果,这就是功能的高内聚。

2.模块之间控制耦合(controlcoupling)应尽量简单,模块之间的数据耦合(Datacoupling)应最小,这就是模块间的低耦合。

所谓控制耦合是指模块进入和退出的条件和进入、退出的方式;

而数据耦合则是指模块间的信息通信,信息量的多少和信息通信的方式。

3.模块的长度适中,模块语句的长度常采用20~100的范围较适合,因为模块太长,对于理解和调试会发生困难,失去模块化的优越性;

若是太短,则为模块所做的连接,通信等工作开销太大,又很不值得。

下面用一个简单的例子来说明如何用层次图和模块说明表示程序模块的划分。

例1对完成峰值一均值滤波算法程序划分模块。

该算法如下:

X=[∑Xi-MAX(Xi)-MIN(Xi)]/(n-2)(n≥3)

其中:

n—采样次数

Xi—i次来样值(8位)

X—滤波结果

划分模块的层次图如图5.3所示。

这里划分为三个层次,由这个层次图就很清楚地表示了程序的全貌。

其中的部分模块说明如下:

1.主模块

名称:

MAIN

功能:

完成峰值一均值滤波算法的总控,并确定采样次数n。

调用情况:

下设四个一级子模块。

2.采样输入子板块

INPUT

人口参数:

将A/D转换器采样的数据定时地通过端口300H输入到数据段中SAMPLB数组存放,作公共区,并定时刷新。

出口参数:

SAMPLE存储数据,可供算法计算的各二级模块使用。

完成数据采样及存储。

3.定时子模块

DELAY

入口参数:

定时时间常数。

产生时间间隔

作采样间隔的定时

4.算法计算子模块

CALCULATE

完成峰值一均值滤波算法的计算

接收下一级子模块的运算结果:

最大值,最小值,采样值总和。

计算结果放入数据区RESULT单元

下设三个二级子模块。

5.选最大值的一级子板块

MAXA

选最大值

从公共数据区取SAMPLE数组

最大值放入数据区的MAX单元

·

在完成模块划分阶段任务后,就可编写程序了。

编写程序应该按一定的结构,讲究技巧,选好关键语句。

5.3 

结构化程序设计(structuredProgramming)

所谓结构化程序设计是指程序的设计、编写和测试都采用一种规定的组织形式进行,而不是想怎么写就怎么写。

这样,可使编制的程序结构清晰,易于读懂,易于调试和修改,充分显示出模块化程序设计的优点。

在70年代初,由Boehm和Jacobi提出并证明了结构定理:

即任何程序都可以由三种基本结构程序构成结构化程序。

这三种结构是:

顺序结构,条件结构(即分支结构)和循环结构。

每个结构只有一个入口和一个出口,三种结构的任意组合和嵌套就构成了结构化的程序。

这三种基本结构又可归纳为五种基本的逻辑结构,如图5-4所示。

菱形框表示条件判断,它有一个入口和两种可能的出口,即条件满足和不满足各有一个出口;

矩形框为处理框,它有一个入口,一个出口,框内可以是一条语句,或一个语句系列,也可用任一种基本结构取代,而且还可以是一个子程序调用或是一次宏调用。

实际上子程序和宏指令也都是采用基本结构组成的模块。

图中的(l)为顺序结构,

(2)和(3)为条件结构,(4)和(5)为循环结构。

子程序和宏指令虽不算是一种基本结构,但它们都是程序设计时常用的方法技巧。

在应用系统的软件中,通常把一些通用的功能编写成子程序或宏指令,构成一个子程序库,是实现模块化程序设计的重要技巧。

结构化程序设计为模块程序设计提供了规定模块逻辑的系统方法,而自项向下的设计法又为组装和测试提供了系统方法。

但是,自顶向下设计时,可能遇到一些困难,可能得不到通用模块,顶层出现的错误将造成严重的影响,致使难以编出高效的程序。

因此,在采用自顶向下设计法时,也可配合以部分的自底向上的设计。

5.4 

程序的基本结构与基本程序的设计

一、顺序结构与简单程序设计

顺序结构的程序从执行开始到最后一条指令为止,指令指针IP的内容为线性增加;

流程结构由一个接一个的处理框组成;

使用的指令为传送类,运算类和移位类指令。

顺序结构的程序一般为简单程序,例如表达式程序,查表程序就属这种结构。

对于这种程序,应重点注意算法及操作数的处理

1.表达式程序

[例5.2]编写计算Z= 

的程序。

设X,Y均为单字节正整数,结果Z大于1个字节。

其程序如图5-5所示,结构流程如图5-6所示。

分析:

本例要计算一个数学表达式,要求是明确的。

我们来看看涉及的操作数:

原始的:

X,Y均为单字节无符号数。

中间的:

一般地,X的平方应为双字节无符号数,3*Y也应为双字节无符号数,教材中设定Y=32,因此也就认为3*Y为单字节。

最终的:

(X*X-3*Y)/2应为双字节数。

为简便起见,这里不考虑不够减的问题,也不考虑除2的余数。

将以上问题考虑清楚以后,我们才能给变量分配内存单元,才能编写程序:

DATA 

SEGMENT

DB25

DB32

DW?

ENDS

……………………………………………………………………………………

CODE 

ASSUME 

CS:

CODE,DS:

DATA

EXPRE 

PROCFAR

START:

PUSHDS 

保护返回地址

SUBAX,AX

PUSHAX

MOVAX,DATA 

初始化DS

MOVDS,AX

………………………………………………………………………………

MOVAL,X

MULAL 

AX=X*X

MOVBL,Y

ADDBL,BL

ADDBL,Y 

在本例中3*Y<

255

MOVBH,0 

必须将BH清零,此行不能少

SUBAX,BX 

X^2-3Y

SHRAX,1 

(X^2-3Y)/2)

MOVZ,AX 

存结果

RET 

返回DOS

ENDP

END 

START 

汇编结束,START为入口标号

在此提出两个问题:

1.程序返回DOS的机制如何?

请考虑远过程(EXPREPROCFAR)的定义、在START处以下的3条指令及最后的RET指令的作用。

2.如果X,Y均为一般值,则程序应该怎样修改呢?

请大家考虑。

2.查表程序

对于一些复杂运算,如计算平方值,立方值,方根,超越函数,三角函数等以及一些输入与输出间无一定算法关系的问题,如有些代码间的转换等都可用查表法解决。

这样,使程序既简单,求解速度又快。

查表的关键在于组织表格。

表格中应包含题目所有可能的值,且按顺序排列,这样就把需要做出判断或运算的任务简化为组织表格。

查表操作就是利用表格首址加索引值得到结果所在地址。

索引值通常就是被查的数值。

[例5.3]利用查表法求Y= 

设X放在数据区XVAL单元,结果存入YVAL单元。

立方表放在从TABLE开始的单元。

TABLE 

DB0,1,8,27,64,125,216

XVAL 

DB6

YVAL 

DB?

STACK 

SEGMENTPARASTACK’STACK’

DB50DUP(?

ASSUMECS:

DATA,SS:

STACK

START 

PUSHDS 

保存返回地址

MOVAX,0

PUSHAX

MOVDS,AX

……………………………………………………………………………………..

MOVBX,OFFSETTABLE 

BX指向表首址

MOVAH,0 

被查数作素引值

MOVAL,XVAL

ADDBX,AX 

移动指针到查表位置

MOVAL,[BX];

查表

MOVYVAL,AL;

RET

STARE

8086指令系统提供的查表转换指令XLAT,可用它代替图5-7的ADDBX,AX和MOVAL,[BX]两条指令的作用,而且还可取消MOVAH,0。

本例,请注意程序的格式,程序中段的定义,其中定义了堆栈段----STACK段,我们以后编程序也应如此。

请考虑,如果要用查表法求更多的立方数,比如求40以内的立方数,程序应如何修改。

5.5一些实用程序的设计

在介绍程序设计基本方法的基础上,这里对一些实用程序进行设计,读者对设计它们时采用的程序结构,算法和使用的关键语句要细心加以体会,对独立进行程序设计是很有好处的。

一、代码转换

微计算机中常用的代码有二进制,十进制,十六进制,BCD码,ASCII码和七段显示码,因此应用中常遇到各种代码的转换问题,例如,从健盘上输入一个十进制数或十六进制数,接收到的它们的ASCII码,而机器运算使用的必须是二进制数,这就需要将接收的十进制,或十六进制数的ASCII码转换为二进制码;

计算机运算得到的结果是二进制码,又需要将它转换为十进制数或十六进制数的ASCII码后,或者显示或者打印。

有些代码间没有一定的算法关系,这种情况下可用查表方法解决。

下面就一些常用的代码转换问题进行编程。

1.十进制

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

当前位置:首页 > 农林牧渔 > 畜牧兽医

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1