Ch程序基本结构及其程序设计_第1页
Ch程序基本结构及其程序设计_第2页
Ch程序基本结构及其程序设计_第3页
Ch程序基本结构及其程序设计_第4页
Ch程序基本结构及其程序设计_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章程序基本结构及其程序设计 软件开发按照软件工程的方法进行,主要包括:系统分析:对用户的需求进行分析并最终对问题 做出明确的定义。系统设计:根据对问题的定义,用能容易转变成 程序的方式对任务做出描述。程序编码:系统设计的实施。用计算机能够直接 理解或能进行翻译的形式编写程序。代码调试:验证程序设计的正确性。系统维护:对系统进行日常维护、做必要的改进 等。以上各步必须认真检查,发现错误应及时纠正, 绝不可以拖延至下一阶段。 由于汇编语言的固有特点,当把系统划分成多个模块后,模块的详细设计可以采用流程图的方法,这种方法比较直观、层次清晰、便于发现错误,细化后的流程图更易于汇编语言的代码实现。

2、可以采用结构程序设计的方法设计程序。即程序的每一部分由若干个单元组成,而每个单元包含一个有限结构集,每个结构有一个入口和一个出口。这种结构便于查错及调试。结构程序有三种基本结构:顺序结构、分支结构和循环结构。相应的程序叫做简单程序、分支程序和循环程序。 第五章 程序基本结构及其程序设计 5.1 顺序结构及简单程序设计 5.2 分支结构及程序实现 5.3 循环结构及程序实现 5.1 顺序结构及简单程序设计 程序设计中最基本的结构是如图所示的顺序结构,它只有一个起始框、一个结束框和一至多个执行模块。具有顺序结构的程序叫做简单程序。顺序结构开始结束 例. 设置光标到屏幕左上角。 SET_CURPRO

3、C MOV AH,2 MOV BH,0 MOV DX,0 INT 10H RET SET_CURENDP 这个程序是顺序执行的,一条指令执行后顺序执行紧接其后的另一条指令。实际上许多程序片段都具有顺序结构。 5.2 分支结构及程序实现 许多实际问题很复杂,有时需要根据不同条件进行不同的处理,此时就需要用分支程序设计。 1.分支结构 不满足满足IFTHENELSE结构CASE结构条件条件C112nC2Cn(1)IF_THEN_ELSE结构程序设计 例1.实现符号函数Y的功能。其中:-128X+127程序5.1是该例的编码实现。 1当X0时Y 0当X0时 -1当X0时2.分支程序设计程序5.1XD

4、B?;被测数据YDB ?;函数值单元 MOVAL,0 CMPX,AL JGBIG JZSAV MOVAL,0FFH;小于0 JMP SHORT SAVBIG:MOVAL,1;大于0SAV:MOVY,AL;保存结果例2在有序表中用折半查找法查找指定元素。编码见程序5.2。 是否、l= 0, h = n-1.m = (l+h)/2.l = m+1.h = m-1.查找成功.查找失败. h ?折半查找算法的流程=程序5.2STACKSG SEGMENT STACK S DW 64 DUP(ST)STACKSG ENDSDATA SEGMENTBUF DB 30H,31H,32H,33H,34H,35

5、H,36H, 37H,38H,39H,41H,42H,43H,44H, 45H;有序表COUNT EQU $-BUF;表项数CHAR DB ?;要查找的数MARK DW 0;查找次数PROMPT DB NO FOUND$;没找到提示信息DATA ENDS CODE SEGMENTASSUME CS:CODE,DW:DATA,SS:STACKSGMAIN PROC FAR MOV AX,DATA MOV DS,AX MOV AH,1 ;输入要查找数的字符 INT 21H MOV CHAR,AL ;保存要找的数 LEA SI,BUF ;表起始地址,初始 ;化区间下限(左) MOV CX,COUNT

6、 MOV DX,SI ADD DX,CX ;最后数的地址加1 MOV DI,DX ;初始化区间上限(右) MOV DX,0 CMP AL,SI ;判边界元素 JB NOFID ;小于表中最小数转未找到 JE FOUND ;是表中最小数转找到 CMP AL,DI-1;判边界元素 JA NOFID ;大于表中最大数转未找到 JE FOUND ;是表中最大数转找到 MOV DX,1 ;初始化查找次数 MOV AL,CHAR ;要查找的数 C1: MOV BX,SI ;循环入口 ADD BX,DI SHR BX,1 ;折半 CMP AL,BX ;比较 JZ FOUND ;找到转 PUSHF CMP B

7、X,SI ;指针下限吗? JZ NOFID ;若等于表示未找到,转 POPF JL LESS ;可能在左半区转 MOV SI,BX ;可能在右半区,调整下限 JMP SHORT NEXTLESS: MOV DI,BX ;调整上限NEXT: INC DX ;查找次数加1 JMP C1NOFID: LEA DX,PROMPT ;显示未找到提示信息 MOV AH,9 INT 21H JMP SHORT EXIT FOUND: MOV MARK,DX;保存查找次数 PUSH DX MOV AH,2 ;显示找到的数 MOV DL,BX INT 21H MOV CL,10 POP AX DIV CL ;把

8、查找次数转换成十进制数 OR AX,3030H;转换成ASCII码 MOV DL,AL PUSH AX MOV AH,2;显示查找次数的高位 INT 21H POP AX MOV DL,AH MOV AH,2;显示查找次数的低位 INT 21HEXIT: MOV AX,4C00H INT 21HMAIN ENDPCODE ENDS END MAIN (2)CASE结构程序设计 可以用跳跃表法实现CASE结构,实现的关键是先要构成跳转表,然后用无条件间接转移指令实现跳转。 例3.编制一个管理文件的菜单程序。该程序应该能够实现建立文件、修改文件、删除文件、显示文件和退出应用程序返回操作系统的主控功

9、能。要求在屏幕上显示5种功能,然后从键盘上选择15即可转入相应的功能,而输入其它字符则提示输入非法并允许重新输入。若选择退出功能,则能正确返回;若选择其它功能,应能返回到菜单,提供继续选择的机会。设菜单程序及5个子功能在同一个模块。 设计跳转表JMP_TAB DW 建立文件分支入口标号 DW 修改文件分支入口标号 DW 删除文件分支入口标号 DW 显示文件分支入口标号 DW 退出分支入口标号如果主控程序及5个子功能分别在不同的段或模块中,只需要把数据定义语句助记符的DW换成DD即可。 分析用无条件间接转移指令实现CASE转移若跳转表是用DW定义的,则用段内间接转移指令。若是用DD定义的,则用段

10、间间接转移指令。段内间接转移的几种格式:JMP JMP_TABSI ;SI中为位移量LEA BX,JMP_TAB JMP WORD PTR BXSI ;SI中为位移量LEA BX,JMP_TABADD BX,位移量JMP WORD PTR BX 说明:位移量是跳转表中所选项与表基址的距离。我们把所有功能号连续排列,设选择了K号功能,则:索引号K起始功能号位移量索引号每项入口地址占用的字节数 表项地址表基址位移量 流程图开始清屏、设置光标显示菜单、等待选择键入选择号响铃警告选择合法?N求表地址转移删除退出建立修改打印Y菜单程序流程 编程根据流程图书写的程序见程序5.3。本例用上述的段内间接转移的

11、第3种格式实现转移。程序5.3stacksg segment stack stk dw 32 dup(s)stacksg endsdata segmentMSG1 DB 1CREATE,0DH,0AH;菜单 DB 2UPDATE,0DH,0AH DB 3DELETE,0DH,0AH DB 4PRINT,0DH,0AH DB 5QUIT,0DH,0AH,$MSG2 DB INPUT SELECT:,0DH,0AH,$ ;选择提示JMP_TAB DW CREATE;地址表(跳转表) DW UPDATE DW DELETE DW PRINT DW QUITdata endscode segmentm

12、ain proc far assume cs:code,ds:data push ds xor ax,ax push ax mov ax,data mov ds,axREPEAT: MOV AX,0600H;清屏 MOV CX,0 MOV DX,184FH MOV BH,07 INT 10HCURSOR: MOV AH,02;设置光标 MOV BH,0 MOV DX,0400H INT 10H LEA DX,MSG1;显示菜单 MOV AH,9 INT 21H LEA DX,MSG2;显示选择提示 MOV AH,9 INT 21HRDKB: MOV AH,1;等待输入选择号 INT 21H C

13、MP AL,31H;选择合法性检查 JB BEEP;若非法则转移 CMP AL,35H JA BEEP AND AL,0FH ;ASCII码转换为非压缩BCD码 XOR AH,AH DEC AX;得到索引值 ADD AX,AX;i项位移量 LEA BX,JMP_TAB;装入表首址 ADD BX,AX;得到表项地址 JMP BX;按表项地址转移BEEP: MOV AH,14 ;响铃警告 MOV AL,7 MOV BH,0 INT 10H JMP SHORT RDKB ;转重新选择CREATE: MOV AH,2 ;建立文件子功能 MOV DL,C INT 21H MOV AH,0 INT 16H

14、 JMP REPEAT;返回菜单UPDATE: NOP;修改文件子功能 JMP REPEAT;返回菜单DELETE: NOP;删除文件子功能 JMP REPEAT;返回菜单PRINT: NOP;显示文件子功能 JMP REPEAT;返回菜单QUIT: ret;返回操作系统main endpcode ends end main 1.循环结构不满足满足条件循环体循环初始化不满足DO-WHILE结构满足条件循环体循环初始化DO-UNTIL结构基本循环结构5.3 循环结构及程序实现 2.循环程序设计 无论使用哪种循环结构,循环程序一般应包括以下几部分:(1) 循环初始化。(2) 循环体。 (3) 循环

15、控制部分。特别要注意循环入口和循环次数的正确设置、地址指针及循环控制条件的修改等,否则会得不到期望的结果。例4 在字型无序表中找出最大数和最小数,并分别存入MAX和MIN单元。程序5.4是本例采用DO_UNTIL结构实现的。 程序5.4STACKSG SEGMENT STACK STK DW 32 DUP(S)STACKSG ENDSDATA SEGMENTBUFFER DW 500,30,56,77,999,67,433, 5675,0,9999;无序表 DW 3455,6578,32766,8,0, 32560,45,889,5665,09CN DW ($-BUFFER)/2;元素个数MA

16、X DW ?;存放最大数单元MIN DW ? ;存放最小数单元DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA SI,BUFFER ;初始化地址指针 MOV CX,CN ;元素个数 MOV AX,SI ;取第一数DEC CX MOV MAX,AX ;初始化最大数 MOV MIN,AX ;初始化最小数COMP:ADD SI,2 ;修改地址指针MOV AX,SI;取下一个数CMP AX,MAX;与当前的最大数比较 JL NEXT;

17、若小于转 MOV MAX,AX;若大于则把此数作为;最大数保存 JMP SHORT LOPNEXT:CMP AX,MIN;与当前的最小数比较 JG LOP;若大于转 MOV MIN,AX;若小于则把此数作为;最小数保存LOP: LOOP COMP;决定循环继续还是终止 RETMAIN ENDPCODE ENDS END MAIN例5自定义一个按降序排列的字型数组,在数组中查找指定的数字,若找到在屏幕上显示“Duplication!”,否则插入该数字在适当位置并继续保持数组有序,且显示“Inserted!”。程序5.5是其编码实现。程序5.5DATA SEGMENTPRT DB Duplicat

18、ion,$INS DB Inserted!,$X DW ? ;为数据移动预留空间TAB DW 889,754,589,546,52,31 ;降序数组CT EQU ($-TAB)/2 ;元素个数N DW 234 ;要插入的数字DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,TAB;装入表首址 MOV AX,N;要插入的数字 MOV CX,CT;个数 CLD REPNZ SCASW JE A;找到转 M

19、OV SI,0 COMPARE:CMP TABSI,AX ;比较 JL B ;小于转 MOV BX,TABSI ;元素前移为插入的数字腾位置 MOV TABSI-2,BX ADD SI,2 ;修改地址指针 JMP SHORT COMPAREA: MOV AH,9H LEA DX,PRT INT 21H JMP EXITB: MOV TABSI-2,AX ;插入元素 MOV AH,9 LEA DX,INS INT 21HEXIT: RET MAIN ENDPCODE ENDS END MAIN例6设数组X、Y中分别存有10个字型数据。试实现以下计算并把结果存入Z单元。Z1X1+Y1Z2X2+Y2

20、Z3X3-Y3Z4X4-Y4Z5X5-Y5Z6X6+Y6Z7X7-Y7Z8X8-Y8Z9X9+Y9Z10X10+Y10流程图如下,程序见程序5.6。YN 开始初始化循环计数值i=0 RULEi=1?Xi+YiXiYiYZi结果i=i+1,循环次数减1N循环计数值=0?用逻辑尺控制循环 结束程序5.6STACKSG SEGMENT STACK S DW 64 DUP(ST)STACKSG ENDSDATA SEGMENTX DW 12H,34H,56H,78H,90HDW 0ABH,0CDH,0EFH,0F1H,023HY DW 9,8,7,6,5,4,3,2,1,0Z DW 10 DUP(?)

21、RULE DW 11100B;逻辑尺DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSGMAIN PROC FAR MOV AX,DATA MOV DS,AX MOV BX,0;地址指针 MOV CX,10;循环次数 MOV DX,RULE;逻辑尺NEXT: MOV AX,XBX ;取X中的一个数 SHR DX,1 ;逻辑尺右移一位 JC SUBS ;分支判断并实现转移 ADD AX,YBX ;两数加JMP SHORT RESULTSUBS: SUB AX,YBX ;两数减RESULT: MOV ZBX,AX;存结果 ADD BX,2 ;修改地址指针 LOOP NEXT MOV AX,4C00H INT 21HMAIN ENDPCODE ENDS END MAIN例7编制用软件延时200ms的程序。设用以下程序片段可以延时10ms:DELAY10: MOV CX,2801 ;置循环次数WT: LOOP WT 则延时200ms只需把以上程序片段循环20次即可,如程序5.7所示。3.多重循环程序设计程序5.7DELAY PROC MOV BL,20;置外循环次数DELAY10:MOV CX,2801;置内循环次数WT: LOOP WT;内循环体、循环次 ;数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论