汇编语言程序设计(三)

第四节 程式规划

程式规划是指在整体设计的观念上,事先对全部程式周详地、有系统地分析,再定出一个明晰的架构,以便于制作。
最理想的方式,是从使用者的角度,先决定应用功能、用键、输入形式、空间结构及模组划分等。
这些都确定了,才能按图索骥,根据蓝图写程式。也就是说,规划即先把目标介定妥当,以便按步就班,循序执行。
1,工作的认识:程式的规划,相当于设计建筑篮图,首先要明确认识工作性质、特征、条件,选择取适当的方式,以求得到最理想的结果。

2,程式的结构:结构要事先定案,是采用流程抑或模组?全部或部份采用组合语言?是依工作人员的素质分工,或者是用生产线统一制作?程式段、资料段及堆栈段的空间分配,每个程式联接次序的安排,暂存器的定义,缓冲器的设置等,都应该慎重地考虑清楚,并记录下来,以供工作之依据。

3,参数的设定:参数是程式的处理对象,必须合情合理地安排,且要有扩充的余地。因为参数与功能分类及程式的效率息息相关,对程式师而言,参数即相当于程式的处理对象;对应用程式的人,则等于工作的分类标准。其安排的结果,影响功能价值甚钜。

4,效率的要求:在第一章第三节中,我们特别强调了效率的法则,使用电脑的目的,就在于效率的追求。故在规划之初,就应该规定每一段程式的效率要求。
另外,参数的运用,也应考虑其使用的频率,凡能在事先一次准备妥当的,切不可等到运用时再临时计算。

5,测试的标准:测试就是品质管理,程式所应达到的指标,可由测试求证之。一般程式师只对程式的正确性负责。其实正确性与指标无关,乃是程式师最起码的责任。
组合语言程式的品质,应该包括原程式的写作规格及时限;程式的思路、理念;执行时的时效;程式空间的大小及安排;应用的方便与否;指令运用是否恰当等等。
执行程式的品管,则可以透过测试程式完成之。这种测试程式,也应该在规划之初,一并考虑。

6,制作的进度:程式制作的进度很难控制,而正因为其难以控制,更要加倍小心,事先规划。其方法是先按照工作性质,设定工作「难度值」。再对工作的程式师评估其「能力值」,依此设定一个「合理」的进度。最后,根据实际的工作进度调整之。一般说来,程式师需要三年以上的写作经验,才能养成进度的观念。
由于程式本身占有空间,所以其结构的好坏,对程式制作及执行效率影响极大。良好的结构应根据程式的性质、使用的频率、处理的先后过程等,在效率的立场,作全面的考虑。

一、程式性质

前文曾介绍过程式的种类,在规划时,要更进一步瞭解程式的性质。因为所谓的效率,一是指程式的制作、维护,一是指程式的执行及调用。这两者必须根据程式的性质,作适当的安排。
大体说来,程式的性质只有两种,一种是主动的,使用者可以直接控制执行;另一种是被动的、公用的,为其他程式所调用。
前者也可以说是应用程式,而后者比较类似系统程式。只是在这里强调的是其性质,以及如何根据其性质进行规划。
主动程式最好能放在同一模组中,当程式太大,必须分割时,也要设法联接在一起。但若在功能不同,所调用的模组亦无交集的情况下,为了避免跨越段与段时的效率损失,则无须考虑是否安置在同一模组内。
由于主动程式涉及使用人的习惯和设计者的理念,经常需要修改调整,变动极大。正因为这种因素,其「再利用」价值不高,对效率的要求也较低。
规划时,主动程式一定要与被动程式分开,而在制作时,则应注意其所占用的空间,与各段的关系。
被动程式既然是公用的,必然具备一些基本的功能。所谓被动是表示该程式仅在某种条件下,才被调用。由于其「再利用」的特色,应该设计成为精简的子程式。再依情况需要,或者为了节省空间,放在磁盘中,随时以覆盖其他子程式方式调用,或者为了效率,直接联接备用。

二、使用频率

对程式执行的效率而言,占用空间与处理时间,经常需要作些取舍。如果程式太大,空间不敷应用,则在规划时,先行统计各个程式的使用频率。
不常用到的程式,不表示并不重要,但若占用了空间,则于效率有损。
这种程式最好独立成一个模组,以便随时可以因应空间的条件,再作打算。
因此在程式规划时,对空间的安排,应该优先考虑使用频率。

三、程式流程

程式有一定的运行规律,称为「流程」,意即在执行时,依照预先安排的顺序,一一流经的过程。
传统的程式写作法,流程非常重要,因为人需要根据一种理念,以逐步检验并付诸实现。但自从模组受到重视后,每个模组代表一种完整的功能,而功能的集合所能实现的效果,远非流程可以表达。这一来,流程的重要性减低了,其地位降到只属于结构中的一部份而已。
因为模组是可组合的,模组越多,主流程便越短。虽然每一个模组也都各有其流程,结构良好的模组,又可再细分为若干子模组,以此类推。因此,流程远不如模组灵活,观念上也显得呆板。
不过,即使在模组设计过程中,有时也有必要藉着流程逐步推理,以瞭解细部的结构。在这种立场,流程的应用原无可厚非。可是一旦反客为主,程式师不用流程即无从思考,就大谬不然了。
流程属于单线思考,人虽然经常使用这种流程推理,但更重要的能力却来自「抽象思考」。抽象思考是指人在许多错综复杂、相互纠结的现象中,能立即掌握重点,针对目的,解决问题。
在程式上,这种抽象思考相当于对所有模组的全面认知,而非仅仅是流程的推理。有了全面的认知,灵活地加以调用,程式的功能就更上层楼,大大的提高了。
如果程式师祇知道根据流程写程式,习惯养成后,不仅程式笨拙不堪,连人的思考方式都连带受到影响。一般所谓的「匠气」、「呆滞」,就是这种机械式训练的结果。
因此,我不赞成利用流程来规划程式,但在解释或说明某种过程时,并不排除流程的方便性。

四、流程图

流程的第一步是画流程图,根据流程图再作细部流程,然后根据细部流程去瞭解或编写程式。
以上面例子,先制作流程图如下: 

┌─────┐
┌>───┤表格码输入│
│ └──┬──┘
│ ┌──┴──┐
│ │取 一 码│
│ └──┬──┘

时间: 2024-09-17 03:27:48

汇编语言程序设计(三)的相关文章

IBM-PC汇编语言程序设计(第二版)习题3.36疑似错题。

问题描述 IBM-PC汇编语言程序设计(第二版)习题3.36疑似错题. 原题干如下: 假设X和X+2单的内容为双精度p,Y和Y+2单元的内容为双精度数q,X和Y为低位字,试说明下列程序段做什么工作? MOV DX, X+2 MOV AX, X ADD AX, X ADC DX, X+2 CMP DX, Y+2 JL L2 JG L1 CMP AX, Y JBE L2 L1: MOV AX,1 JMP SHORT EXIT L2: MOV AX,2 EXIT: INT 20H 接下来是习题解: 此

汇编语言——Intel汇编语言程序设计(第5版)中文版

问题描述 汇编语言--Intel汇编语言程序设计(第5版)中文版 学会汇编语言的话,Intel汇编语言程序设计(第5版)中文版这本书怎么样呢

汇编程序-汇编语言程序设计求助

问题描述 汇编语言程序设计求助 题目一:将内存一个从符号地址DATA1开始连续m个存储单元的内容复制到内存中从DATA2开始的另一个区域,DATA1和DATA2在同一个数据段 题目二:对于内存中从地址DATA1开始连续存放的一组字节型数据,寻找最大值和最小值程序

C++程序设计三周教学记录

从第五周到第八周,除去第七周的国庆,C++共上了三周的课.大一新生三周能学会些什么?他们已经能输出漂亮的星号图了.身为老师的我,和这群大孩子一样高兴.同学们的努力令我感动,自己的不少非常规的想法和做法在他们的配合下正在起着作用,我已经感觉到,他们中的绝大多数将就此找到感觉,不光是专业学习,而是整个大学生活,在忙碌和不断出现的困难中,在快乐和不断冲破束缚的过程中,享受大学带来的一切. 原先安排第四周开始讲课,三次课后才上机,我已经计划好有充足的时间先"纸上谈兵".程序设计的功夫在上机之外

汇编语言程序设计(四)

第五节 程式写作 说了不少,才真正到了写作程式的时候,运用指令就相当于写程式.只是,在运用指令前,一定要充份瞭解一应相关的课题.否则,应用指令如同和稀泥一般,堆砌出一团可以运作的成品,我个人不认为那能叫做「写程式」,充其量只是涂鸦罢了. 一.暂存器安排 因为暂存器不足,必须事先安排妥当,才能有效应用. 再以前例说明,需要安排的因素有: 1,字形大小:此项有两个变数需要安排,一是横向之始.终值; 另一是纵向之始.终值.因为在设计之初,我已经 考虑到极限值的问题,将上限定在 256点,恰在一个字元 

汇编语言程序设计(二)

四.模组分割 既然称为模组,本不存在分割与否的问题.如果一个程式师一开始就具备模组的观念,彻底瞭解其性质,当然知道如何设计,自然就没有分割的必要.即令如此,在程式的制作过程中,经常是信马游缰,想到哪,写到哪.所以,养成模组分割的观念,对实际工作上,自有其必然的功效. 模组分割的原因不定,大约可分下列数种: 1,为了制作的方便,把程式分成模组,易于维护. 2,为了工作效率,或需要速度.或为节省空间的程式,分别用不同的技巧制作. 3,因程式师的工作能力,或工作条件而进行分割. 4,因程式的功能分类,

并发程序设计——三个顺序线程练习

question:     有三个线程 t1,t2,t3,如何保证这三个线程顺序执行?        public class ShunXuThreadTest { @Test public void threadTest() throws InterruptedException { Thread t1=new Thread(new soutThread(1)); t1.setName("t1"); t1.start(); t1.join(); Thread t2=new Threa

汇编语言程序设计(五)

四.桥式法: 桥式法是利用读写记忆体的特性,将程式中若干指令直接填入,作为临时便桥,以改变此段程式的功能. 例如在显示时,希望能提供多种变化,而又不愿减低速度及增加太多的程式.最好的方法,便是利用桥式法,在同一位址,填入需要的指令. 桥式法用得好而又灵活时,对程式的效率极有助益.但是应该注意一点,就是只能用在可读可写的记忆区中,如若要制成「韧体」,即置入仅读记忆体(ROM) 中的程式,绝不可使用此法. 下面的实例,即为萤幕显示的桥式应用.首先,把架桥的「材料」设置在缓冲器中,如: CDSPMOD

JavaScript面向对象程序设计三 原型模式(上)_js面向对象

我们创建的每一个函数都有一个prototype(原型)属性,该属性是一个对象,包含可以有特定类型的所有实例共享的属性和方法.使用它的好处就在于可以让所有对象实例共享它所包含的属性和方法,也就是说,不必在构造函数中定义对象的信息,而是可以将这些信息,直接添加在原型对象中,如下所示,还是接着改写前两篇日志中的例子: 复制代码 代码如下: function Employee() { }; Employee.prototype.Name = "Jim"; Employee.prototype.