




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 顺序结构程序设计 8.1 汇编语言程序设计的基本方法 8.2 顺序结构程序设计 第8章 顺序结构程序设 8.1 汇编语言程序设计的基本方法 程序的设计重在“语法”和“算法”,语法有错得不到可执行程序,算法出错其 结果不正确。所以掌握“语法”和“算法”是缺一不可的,一个好的程序应该满 足设计的要求。在实现正常运行和预定的功能以外,还应该充分考虑: (1)程序要结构化,简明、可读性好和易调试; (2)执行速度快; (3)占用存储空间小。 在早期的计算机中,由于存储设备昂贵,容量很有限,一般应尽可能少 占用存储空间,8086CPU只有20根地址线,对内存寻址才1MB空间,所以 内存空间就显得很珍贵。随着科学技术和生产技术的发展,半导体存储器 的芯片容量不断增大;磁盘的密度不断提高,而其相应的价格也在逐渐下 降,因此,有时候也就不那么特别注重程序是否多占用了一些存储空间, 而偏重于程序的可读性强等方面的问题。但对计算机的某些应用场合,如 智能化的仪器仪表,电脑化的家用电器等设备中的监控程序,通常采用汇 编语言编写的程序,所以要求它的功能要强,程序要短,维护方便等,存 储容量不能太大,才能达到微型化及价格低的目的。 程序执行速度问题,在某些实时控制系统,跟踪等程序中就显得特别 突出。例如,在生产过程中,需要对一些对象中的某些参数进行实时控制 ,如果参数变化速度特快,程序执行速度又太慢,就可能发生失控现象。 对处理其它问题时,因目前主频永远高于原先计算机的主频,速度越来越 快。所以速度与占用内存已不是主要矛盾,编程者要把主要精力放在“程序 要结构化,简明、可读性好和易调试”的方面。 需要说明,本书后面讲到的汇编语言程序设计都只在实模式下进行的 ,从80286开始系统已经为用户提供了实模式和保护模式;而从80386开始 ,又有虚86模式,这模式可在一台计算机上可以同时运行几个8086程序。 就编程者而言,面对的是实模式和保护模式两种工作方式,这两种方式并 无本质的区别,只是所处环境和实现恢复存在一些差别,只要掌握在实模 式下的汇编语言编程的基本方法,再了解保护模式的编程环境,则在保护 模式下编程也并非难事。 随着计算机应用领域的扩展和计算机技术的迅速发展,程序将日趋庞 大和复杂。尤其是一些系统程序,不断增强功能和更换版本,一般要求后 面的版本往前是兼容的。因此目前的程序都形成模块化结构。 8.1.1 汇编语言程序设计的基本过程 汇编语言程序设计的基本过程,大体上可以分为以下几个步骤: 1分析问题,明确要求 分析问题就是按给定的课题进行认真而深入研究,对所要解决的问题进行全面了解 和分析。一个实际的问题由于环境条件等原因,往往都是比较复杂的,只有在 深入分析问题的基础上,善于抓住主要矛盾,剔除次要矛盾,才能抽取问题的 本质,显露解决问题的思路或解题的大体方案。 所谓明确要求就是明确用户的要求,依据给出的条件和数据,应该需要进行哪些处 理,输出什么样的结果,针对实际需求进行可行性分析。 建立数学模型 在分析问题和明确要求的基础上,要建立面向实际问题的数学模型,将一个物理过 程或工作状态,用数学形式表达出来,这个形式可能是一些公式、表格等等。 确定算法和处理方案 数学模型建立后,必须研究和确定算法,以便选择较好的方案。所谓算法是指解 决某些问题的计算方法,不同类型的问题有不同的计算方法。根据问题的特点 ,对计算方法进行优化。如果没有现成的方法可以选用,必须通过实践探索, 并总结出算法思想和规律性。有了好的正确的算法,才能得到正确的结果,这 才是我们工作的方向和目标。 编制程序流程图 把解题的方法、步骤用框图(流程图)形式表示。如果要解决的问题比较复杂, 那么可以自上而下逐步求精,直到每一个框都能很容易用指令或程序段表示为 止。 流程图是程序算法的图形描述,它以图形方式把要解决的问题先后次序和程序的逻 辑结构直观、形象地描述出来,使得解题的思路更加清晰,有利于理解、阅读 和编制程序,还有利于调试、修改程序和减少错误等。 (1)处理框:如图81(a)所示。在处理框内可以写明某一段程序或某一模块的 功能或某一条指令所完成的功能。其特点是有一个入口,一个出口。 (2)判断框:见图81(b)所示。可用菱形或尖角形框表示。框内写明比较、 判断的条件。条件较长时,用尖角框表示较合适。它可有一个入口和安排两个出口 ,在每个出口处都要写明条件判断的结果。若条件成立,一般写“是”或“Y”,也有写 明具体条件的内容,如判开关的状态,如果判断框内写的是:“开关处于开通状态否 ?”,若条件成立可写为“开”或“Y”;若条件不成立,则写成“否”或“N”等均可,因为 它是写给人看的,明白其意就可以。它们表达的意思是为编程方便或提供给阅读的 人看的图形。 (3)起止框:如图81(C)所示。表示一个程序或一个程序模块的开始和结束 。起始框内通常用模块名(如过程名)、标号或“开始”字符表示,它仅有一个出口 。终止框内通常用“结束”、“暂停”或“返回”等文字表示,它仅有一个入口。 (4)连接框:如图81(d)所示。当一个程序框图比较复杂,需要分布在几张 纸上,或者虽然在一张纸上就能给出一个程序框图,但在流程图中连线较多且常常 纵横交错,这时可用连接框表示两根流向线的连接关系。所以连接框内常用字母或 数字来表示。框内有相同字母或数字就表示它们有连线关系。它只有一个出口或入 口。 (5)指向线:如图81(e)所示。指向线是由带箭头的线段表示的,它表示程序的 流向以及程序执行的顺序和去向,如程序的流向是从上往下或从左往右等。 当然,对于那些简单的较小的程序,它的流程并不复杂,一般也可以不需要画 出流程图。但对于一个比较复杂的问题,程序比较大,先着手画出解决问 题思路和编程方向的流程图,很有意义。从流程图上可以直观地检查出程 序的总体结构是否正确合理,再根据流程图来编制程序,可以说方向明确 ,心中有数,不会陷入盲目性。这样,可编写出比较良好的程序。流程图 的确定,可以说任务已经完成了大半,因为,只要熟悉指令系统,编程就 比较快捷了。流程图在调试程序的过程中,对检查程序功能或流程方面存 在的错误,也较为方便,方便于确定在何处设置断点。 合理分配存储空间和寄存器 汇编语言程序直接面向的资源之一是存储器。程序运行时,程序目标代码、 大量数据都是从指定的存储单元中取出,而中间结果或最后结果要送入指 定存储单元,因此,为了充分利用存储空间,根据需要分别定义数据段, 堆栈段,代码段以及附加段。工作单元可设置在数据段或附加段中的某些 存储单元。 寄存器也是汇编语言程序直接面向的资源,在程序中,无论是对数据进行操 作或传送,还是从存储器中寻找操作数,8086CPU常使用寄存器,而且有 的操作要求使用特定的寄存器,如堆栈操作就要求使用SS或SP,循环指令 LOOP必与CX寄存器配合等等。CPU中寄存器的数量有限,编程中必须合 理分配各寄存器的用途。 6编制程序:根据程序流程图编制源程序。正确使用指令、宏指令、伪指令 编写汇编语言程序,这个阶段就是与写文章一样,体现出自己的编程风格。 7调试程序:以上步骤仅仅是完成了源程序的编写,对于一个程序设计人员,尤 其是程序设计的初学者,很难做到所编制的程序能够一次成功,而没有一点 错误。若有错误,问题在哪里呢?如何修改?这一切都可以在计算机上运行 调试来完成。也只有在计算机上执行结果正确的程序,才能算是通过的程序 。特别是对于复杂的问题,往往要分解成若干个子模块,分别由几个人编写 ,而形成若干个程序模块,把它们连接在一起,才能形成总体程序。一般来 说,总会有这样或那样的错误存在,在调试程序过程中这些错误都可以被发 现,然后进行修改,再调试,再修改,直到所有的错误纠正为止。 试运行和分析结果 试运行和分析结果是为了检验程序是否达到了设计要求,是否满足用户提出的 需求,所确定的方案是否可行。若没有达到事先的设计要求,不满足用户的 需求,就必须从分析问题开始检查并修正原有的设计方案,直到符合设计要 求和满足用户需求为止。 整理资料,投入运行 在试运行满足各种需求之后,应当系统地整理材料,有关资料要及时归档或提交 给用户,以便正常投入运行。以上8与9两项是面向科研设计人员的问题。 8.1.2 程序结构化的概念 在计算机发展的初期,由于计算机硬件贵,内存容量小和运算速度慢,当时衡量 程序质量好坏的主要标准看其占用内存的大小和运算时间的长短。为达到此目的 ,编程者挖空心思寻找技巧,这种程序往往使人难以理解和消化,造成人力和时 间的严重浪费,而且使程序设计没有统一的规范。 随着计算机的迅速发展,特别是大规模和超大规模集成电路技术的兴起,使计 算机硬件价格大大下降,内存容量不断扩大,如从8086的1MB的内存,现在内存 最大可以设置为4GB=4096MB,由于主频的不断提高,使运算速度也大幅度加快 。因此,要求运行时间短和节省内存已不是主要矛盾,而应使程序具有良好的结 构,清晰的层次,容易阅读和理解,容易修改和查错,这是对以前的传统设计方 法提出了挑战,从而产生了结构化程序设计方法。 结构化程序设计是1969年由荷兰学者EWDijkstra等人提出的。这种新的程序设 计方法包括以下三个方面的内容: 1程序由一些基本结构组成:包括顺序结构、选择(分支)结构和循环结构, 由这些基本结构组成一个结构化程序。 2一个大型的复杂程序应按其功能分解成若干个功能模块,并把这些模块按层 次关系进行组装。每个模块内的执行步骤都应该很清楚,整个程序的算法和每个 模块算法,都用标准的结构来表示。每个结构内还可以包含有和自己同样形式的 结构或是其它形式的结构,而且每个结构只有一个入口点和一个出口点,以结构 化的方式编写的程序容易理解,也容易修改错误。 3在程序设计时,应采用“自顶而下,逐步求精”的实施方法,又称为“系统化程 序设计”方法。采用此法,首先要把一个大型程序分解成几个主要的模块。其中 主模块用来说明这些主要模块之间的关系以及它们的功能,而每个主要模块可再 分解几个较小的模块,然后继续分解成更小的模块,直到每个模块内的操作步骤 都很清楚,很容易理解为止,最后把一个模块或几个模块分配给不同的编程人员 进行编写。 与“自顶而下”的程序设计方法相对应,还有“自下而上”的程序设计方法,此法是 程序员先开始编写低层次的模块并且期望这些模块最后能组成在一起。如果组合 完成了,那么和“自顶向下”的设计方法产生相同结果。目前许多程序设计都是混 合使用这两种方法,由上而下开始设计,然后由最小的模块开始编写,测试连接 ,再一直往上做,直到最终完成为止。 程序结构化的首要问题是程序的模块化。一个大型复杂的程序可以划分为若干个 功能模块,其中有一个为主模块,由它选择和调用其它各个功能模块,被调用的 各个模块称为子模块。这种将一个复杂的大型程序按其功能划分为若干个相对独 立的模块进行程序设计的方法称为程序的模块化。 按结构化程序设计方法编写出的程序,具有风格优美、结构优良、层次分明、可 读性强、易于理解、便于修改等优点。 在汇编语言程序设计中,程序模块通常是利用编写子程序(或过程)的手段来 实现。 DATA SEGMENT DATB DB 63H,74H,5AH,79H,6AH,7CH,86H,3FH DATA ENDS STAK SEGMENT STACK DW 20H DUP(?) STAK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,DATB MOV AX,SI ;寄存器间址类型随同AX ADD SI,2 ;地址调整,因是字操作则加2 MOV BX,SI ADD SI,2 MOV CX,SI ADD SI,2 MOV DX,SI MOV AH,4CH INT 21H CODE ENDS END START 【例82】 对两个无符号数求其平均值。它们分别存放在X和Y字节存储单元中 ,而平均值存放在Z字节存储单元内,试编写完整的源程序。 DATA SEGMENT X DB 88H Y DB 8CH Z DB ? STAK SEGMENT STACK DW 10H DUP(?) STAK ENDS DATA ENDS CODE SEGMENT ASSUME CS:CODE ,DS:DATA START: MOV AX,DATA MOV DS,AX ;设置数据段的段基值 MOV AL,X ;取第一个数 ADD AL,Y ;两数相加 MOV AH,0 ; ADC AH,0 ;回收进位值 MOV BL,2 ;除数为2 DIV BL ;AX/BL有AL商,AH余数 MOV Z ,AL ;仅处理商存入Z单元中 MOV AH,4CH ; INT 21H ;返回DOS CODE ENDS END START 注:可用SHR AX,1代替MOV BL,2与DIV BL两条指令。 【例83】 以字节变量TABLE为首址的16个单元中,连续存放015的平方值( 平方表),今任意给一个存放在XX字节单元中的数X(0X15),例如X为12, 查表求X的平方值,并把结果存入Y字节单元中。 分析:根据给定的平方表的存放规律,可知表的起始地址与数X之和,正是X的 平方值所在单元的偏移地址,编程如下: DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49 DB 64,81,100,121,144,169,196,225 XX DB 12 Y DB ? DATA ENDS STAKSEGMENT STACK DW 30H DUP(?) STAK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA BX,TABLE ;BX取平方表的首地址偏移量 MOV AL,X ;AL取待查单元的位移量 MOV AH,0 ADD BX,AX ;形成X单元的偏移量 MOV AL,BX MOV Y,AL MOV AH,4CH INT 21H CODE ENDS END START 可直接用查表指令XLAT来编写,主要程序部分如下: LEA BX,TABLE MOV AL,X XLAT MOV Y,AL MOV AH,4CH INT 21H 注:查表指令XLAT只能是字节操作。 【例84】 把一个字节的8421BCD码转换成ASC11码。 编写一个完整的源程序,将DAT字节单元存放的两位BCD码,转换成2个字节的ASC11码 ,并分别存放在ASC和ASC1字节单元中(存低位BCD码的ASC11码)。 例如:(DAT字节单元)=86H,那么(ASC字节单元)=38H,(ASC1字节单元)=36H ,程序如下: DATA SEGMENT DAT DB 86H ASC DB ?,? DATA ENDS STAK SEGMENT STACK DB 100 DUP(?) STAK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STAK START: MOV AX,DATA MOV DS,AX MOV AL,DAT MOV CL,4 SHR AL,CL OR AL,30H MOV ASC,AL MOV AL,DAT AND AL,0FH OR AL,30H MOV ASC+1,AL MOV AH,4CH INT 21H CODE ENDS END START 这种转换也可用下列程序段: MOV AL,DAT MOV ASC,AL MOV ASC+1,AL MOV CL,4 SHR ASC,CL OR ASC,30H AND ASC+1,0FH OR ASC+1,30H 【例85】已知16位带符号数的字变量W、X、Y、Z,试按下列给 定的公式编写程序:(W(XY+Z800)/Y,计算结果的商存 在AX中,余数存放在DX中。 DATA SEGMENT W DW 3678H X DW 8866H Y DW 0ABCDH Z DW 98EFH DATA ENDS STAK SEGMENT STACK DW 20H DUP(?) STAK ENDS CODE SEGMENT ASSUNE CS:CODE,DS:DATA STRAT: MOV AX,DATA MOV DS,AX MOV AX,X IMUL Y ;计算X*Y MOV CX,AX ;暂存低16位乘积 MOV BX,DX ;暂存高16位乘积,让出AX,DX MOV AX,Z CWD ;进行符号位扩展 ADD CX,AX ADC BX,DX ;计算X*Y+Z SUB CX,800 SBB BX,0 ;计算X*Y+Z800 MOV AX,W CWD SUB AX,CX SBB DX,BX ;计算W(X*Y+Z300) IDIV Y ;计算(W(X*Y+Z300))/Y MOV AH,4CH INT 21H CODE ENDS END START 本例是一个带符号数的加、减、乘、除运算的综合题。 【例86】 不使用乘法指令,计算Y=10*X 算法分析:Y=10*X=X*8+X*2X*(82),可借助算术左移或逻辑左 移指令来实现。编写程序如下: ;使用简化段模式编程: DOSSEG .MODEL SMALL .STACK 100H .DATA X DB 22H Y DB ? .CODE START:MOV AX,DATA MOV DS,AX MOV AL,X SAL AL,1 ;X*2 MOV BL,AL SAL AL,1 ;X*4 SAL AL,1 ;X*8 ADD AL,BL ;X*10 MOV Y,AL MOV AH,4CH INT 21H END START 又如:17*XX*(16+1)的方法进行;15842+1按二进制的权分 解。 【例87】 用NOT指令对123求补 ;使用简化段模式,编程如下: DOSSEG .MODEL SMALL .STACK 100H .CODE START:MOV AL,123 NOT AL ;求反 ADD AL,1 ;加1即为补 MOV AH,4CH INT 21H END START 这是使用“求反加1”的方法对一个数求补,回顾求补指令其主 要程序段为: MOV AL,123 NEG AL 【例88】 输入09之间任意两个数值,分别进行加法与乘法运算,输出结果。 采用非压缩的8421BCD码处理较为方便。程序中的数据并不多,直接选择寄存器来 存放数据。 DOSSEG .MODEL SMALL .STACK 100H .CODE START:MOV AH,1 INT 21H ;1号功能,输入一个数字 MOV CH,AL ;从AL回收按下所在键的ASCII码 INT 21H ;输入另一个数字 MOV CL,AL ;第二个数字的ASCII码存入CL中 MOV AH ,0 ; ADD AL,CH ;求和 AAA ;调整后的十位数在AH中,个位数在AL中 OR AX,3030H ;把数字转换成ASC11码 MOV DH,AL ;保存和的个位数 MOV DL,AH ;十位数送显示 MOV AH,2 ; INT 21H ;输出和的十位数 MOV DL,DH ;取个位数 INT 21H ;个位数显示 MOV DL,20H ;20H为空格的ASCII码 INT 21H INT 21H ;输出两个空格后再显示乘积 SUB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社会单位消防培训课件
- 二坝初中九年级数学试卷
- 高三学生满分数学试卷
- 肉羊养殖技术课件
- 肉牛屠宰加工技术课件
- 2024年12月恒丰银行烟台分行社会招考笔试历年参考题库附带答案详解
- 龙湖文化培训课件资源
- 2025至2030城市轨道行业市场深度研究与战略咨询分析报告
- 2024年广州市海珠区六中珠江中学招聘教师笔试真题
- 2025至2030不锈钢取石机行业市场深度研究与战略咨询分析报告
- 超声科专业管理制度
- 2025年供应链管理与运作考试题及答案分享
- 2025至2030年中国粒度仪行业市场运行格局及发展趋势研究报告
- 2025邯郸武安市选聘农村党务(村务)工作者180名笔试备考试题及答案详解一套
- 重庆市普通高中2025届高一下化学期末学业质量监测试题含解析
- 职业技术学院公共机房台式电脑采购服务方案投标文件(技术方案)
- 主管护师《专业实践能力》考试真题及答案(2025年新版)
- 井下探矿管理制度
- 2025版中华民族共同体概论课件第三讲文明初现与中华民族起源(史前时期)第四讲天下秩序与华夏共同体演进(夏商周时期)
- 浙江省宁波市宁海中学2024-2025学年高一上学期期初考试(创新班)物理试题含答案或解析
- 医疗信息化设备项目立项申请报告
评论
0/150
提交评论