资源预览内容
第1页 / 共184页
第2页 / 共184页
第3页 / 共184页
第4页 / 共184页
第5页 / 共184页
第6页 / 共184页
第7页 / 共184页
第8页 / 共184页
第9页 / 共184页
第10页 / 共184页
亲,该文档总共184页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第5章 基本程序设计第5章 基本程序设计 5.1 顺序程序设计5.2 分支程序设计 5.3 循环程序设计5.4 子程序设计5.5 具有模块结构的程序设计第5章 基本程序设计5.1 顺序程序设计 8086的汇编语言程序设计比较复杂, 掌握它有一定的困难, 故必须先掌握8086 的指令系统及汇编语言的基本约定。 从本章起, 我们可以集中力量来解决程序设计的方法问题, 并将编写的源程序进行汇编和连接, 生成对应的可执行的程序文件, 在MSDOS 环境下运行这些程序, 这将大大加快学习汇编语言的进程, 深入掌握汇编语言程序设计的方法。 第5章 基本程序设计任何一种程序设计语言编写的程序, 其结构都是由顺序程序、 分支程序和循环程序这三种基本结构组成的。 程序结构设计方法简介。程序结构设计是把算法转化为程序的准备阶段。 对于算法比较复杂的问题, 应绘制程序结构图或程序流程图。 结构图可描述各模块间的参数传送及相互调用 的关系, 程序流程图则能较好地描述程序执行的过程。 第5章 基本程序设计1. 结构图(structurechart)结构图是描述程序结构和程序模块间的关系的一种设计方法,它的基本部分是长方形框, 每个框表示1个模块, 如图5.1所示。 方框内用字符串表示(标记)模块的名字, 方框之间的带方向的箭头连线表示模块间的调用关系。 调用模块或外层模块通常画在上面, 箭头指向的框表示被调用的模块或内层模块, 图5.1(a)中, A框为调模块, B框为被调用模块。第5章 基本程序设计若可以选择性地调用, 主模块以射线的形式表示, 如图5.1(b)中, 调用模块A可有选择地调用B, C及D模块。 图5.1(c)则描述了在一个循环层中调用B, C, D模块的方式。 图5.1(d), 描述当两个模块间有信息交换时的情况, 此时可用带标注的箭头来表示信息内容.第5章 基本程序设计图 5.1 结构图法示例 第5章 基本程序设计2. 流程图法(flowchart)流程图是最早被使用的一种方法, 也是最直观的方法。 流程图由逻辑框和流程线组成。 逻辑框是指示程序的操作功能的符号, 流程线是指示操作顺序的符号。 流程图常用符号如图5.2所示。 第5章 基本程序设计图 5.2 流程图中的符号 第5章 基本程序设计(1) 端点框端点框表示程序的两端起点和终点。 框内可以写上合适的文字,例如“开始(start)”, “结束(end)”或者程序名, 起始地址等。 (2) 过程框或处理框用于表示一种处理功能或过程的程序段, 框内可用文字标注扼要的功能或过程说明。 该框可以简单到只 包含一条指令, 复杂到描述一个程序模块(或子程序即过程)。 第5章 基本程序设计(3) 判断框用于表示1个程序中判定点, 程序将从这一点开始分支, 框内用文字符号注明检测条件, 而检测的结果分别注明于各分支流程线上。 (4) 连接框它表示1段程序在此处被人为中止, 框内标有符号, 以便与带有同样符号的另一个框相联系。 对于一个大的流程图或由于篇幅不够、 或由于避免出现交叉而不 得不被打断的情况下, 用连接框表示程序流程图从何处被中止, 又从何处重新开始。 第5章 基本程序设计(5) 流程线带有箭头的流程线用于指出程序执行的流向。 一个程序按其功能可分为若干部分, 每部分可用一个逻辑框来表示,各个逻辑框通过流程线有机地联系起来, 构成了总的程序流程图。 流程图可以清楚地反映设计思想和程序结构是否合理。 流程图是程序设计中使 用得最早, 最易为人们接受和应用的一种有效的工具。第5章 基本程序设计3. NS图(NASSISHCINDERMAN)NS图又称为方块图, 是结构化程序设计中的算法描述工具。 用NS图得到的程序一定是结构化程序。 非结构化的程序, 用NS图是无法表示的。 它有三种基本逻辑,五种类型, 如图5.3所示。 三种基本逻辑即顺序逻辑、 选择逻辑和循环逻辑。 选择逻辑可分为单分支和多分支两类。 循环逻辑又 分为当型循环(do while)和直到型循环(do until p)两类。 第5章 基本程序设计图 5.3 NS图表示法 第5章 基本程序设计4. 伪码流程图伪码流程图是通过形式语言描述程序结构的一种方法。它可以直接把流程图或方块图(NS图)以伪码流程图的形式表示出来, 并能很方便地转化为程序。 例如: 选择结构可以表示如下: IF PTAELSEBENDIF第5章 基本程序设计对于多分支的选择结构可用伪码流程图表示如下: DOCASECASEP1ACASEP2B CASEPNSENDCASE第5章 基本程序设计5.1.1 简单算术运算及逻辑运算顺序程序 1. 单字节压缩BCD数加法运算例5.1 将存储单元A1和A2中的两个BCD数相加, 结果送至A3单元中。 相加后的进位送至A31单元。 分析: 为了得到十进制的结果, 应在两个字节相加后再用加法十进制调整指令DAA进行调整。 对于A1、 A2、 A3这三个存储器变量的存取方法, 希能通过实例掌握。 第5章 基本程序设计源程序如下: NAMEEX051DATA SEGMENTA1 DB48HA2 DB53HA3 DB2DUP(? )DATA ENDSCODE SEGMENTASSUMECS: CODE, DS: DATA第5章 基本程序设计START: MOVAX, DATAMOVDS, AXMOVAL, A1ADDAL, A2DAAMOVA3, ALLAHFANDAH, 01HMOVA31, AHMOVAH, 4CHINT 21HCODE ENDSEND START第5章 基本程序设计2. 二进制字加法及乘法运算例5.2 首先将FIRST字变量与SECOND字变量相加, 结果存至THIRD存储字中,然后将FIRST与SECOND两个字变量相乘, 结果存至THIRD1开始的两个字中。分析: 8088的指令既可进行字节运算, 也可进行字运算, 只要变量类型定义正确,本程序即很容易编写。 第5章 基本程序设计源程序如下:;NAME EX052DATA SEGMENTFIRST DW7684SECOND DW23569THIRD DW ? THIRD1 DW2DUP(? )DATA ENDSCODE SEGMENTASSUMECS: CODE, DS: DATA第5章 基本程序设计START: MOVAX, DATAMOV DS, AXMOV AX, FIRSTADD AX, SECONDMOV THIRD, AX; 保存加法结果MOV AX, FIRSTMUL SECONDMOV THIRD1, AXMOV THIRD12, DX; 保存乘法结果MOV AH, 4CHINT 21H第5章 基本程序设计CODE ENDSEND START其中MULSECOND实现16位乘法, 即(AX)*存储器字,存储器变量给指令功能的灵活性发挥了很大的作用, 使程序设计变得更加简单省事。 第5章 基本程序设计3. 取数的反码和补码 例5.3 将字变量A1转换为反码和补码, 分别存入字变量A2和A3中。 分析: 此处的取反码和取补码, 是指取一个数的相反数的反码和补码。 取反码要求原数按位求反, 可由NOT指令实现, 补码可由反码加1得到。 也可以由NEG 指令获取相反数的补码, 由补码减1得到反码值。 所以可用两种方法来实现。 第5章 基本程序设计(1) 先取反, 再取补的程序段: MOV AX, A1 NOT AX ; 取反码MOV A2, AXINC AX ; 形成补码MOV A3, AX第5章 基本程序设计(2) 先取补再取反的程序段:MOV AX, A1NEG AX ; 取补码MOV A3, AXDEC AX ; 形成反码MOV A2, AX第5章 基本程序设计5.1.2 字符处理和代码转换程序 1. 屏蔽和组合例5.4 将字类型变量A的高4位和低4位置0, 其余各位保持不变。 分析: 要让一个数的某几位置0, 则只要与一个数相与。 对应位为0, 则相与结果即为0; 对应位为1, 则相与结果即保持不变。 此处应与数0FF0H相与, 0FF0H 被称为屏蔽字。 对应的程序段如下: 第5章 基本程序设计MOV AX, AAND AX, 0FF0HMOV A, AX也可用1条8086指令实现: ANDA, 0FF0H; 可见8086指令灵活、 功能强大第5章 基本程序设计2. 拆字 例5.5 将存储单元A中2个压缩BCD数拆成2个非压缩的BCD码, 低位BCD数存入C中,高位BCD数存于B中, 并将对应的ASCII码存入C1及B1中。 分析: 将1个字节中的两位BCD码分开, 可采用屏蔽高4位、 保留低4位的方法,得到低位BCD码; 由未组合的BCD码转为ASCII码, 只要高4位加或或30H; 若将高4位BCD码分离,可以采用逻辑右移4位的方法, 左边移入4个0, 即可达到目的。 程序段如下: 第5章 基本程序设计程序段如下: NAMEEX055DATA SEGMENTA DB 37HB DB? C DB? B1 DB? C1 DB? DATA ENDSCODE SEGMENT第5章 基本程序设计ASSUME CS: CODE, DS: DATAMAIN PROC FAR START: PUSH DSMOV AX, 0PUSH AX ; 保存返回地址MOV AX, DATA MOV DS, AXMOV AL, AMOV CL, 4SHR AL, CLMOV B, AL第5章 基本程序设计OR AL, 30HMOV B1, ALMOV AL, AAND AL, 0FHMOV C, ALOR AL, 30HMOV C1, ALRET ; 返回DOSMAIN ENDPCODE ENDSEND START第5章 基本程序设计3. 查表将1个09的BCD数转换成格雷码格雷码又称循环码, 循环码的特点是任意两个相邻的数之间只有1位状态改变。 即任意一个BCD数与它相邻的数之间只有1位(二进制位)的状态不同。 满足这种要求的编码状态很多,表5.1仅给出一种。第5章 基本程序设计表5.1 格雷码与BCD数之间的对应关系 第5章 基本程序设计例5.6 将变量A中的两位BCD码转换为格雷码。 高位格雷码存于C中, 低位的格雷码存于B中。 分析: 查表指令XLAT是实现转换的关键, 该指令要求从(DS): (BX)(AL)中取得结果。源程序如下: NAMEEX056DATA SEGMENTGRAY DB 00H, 01H, 03H, 02H, 06HDB 0EH, 0AH, 08H, 0CH, 04H第5章 基本程序设计A DB25HB DB? C DB? DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART: MOV AX, DATAMOV DS, AXMOV AL, AMOV
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号