1、第四章 程序设计方法和上机调试 4.5 程序设计方法程序设计方法 4.6 宏汇编和条件汇编宏汇编和条件汇编4.5程序设计方法程序设计方法 好的程序的特点:好的程序的特点: 模块化模块化 效率高效率高 占用空间小占用空间小 基本设计方法基本设计方法 需求分析需求分析 明确任务要求明确任务要求 概要设计概要设计 功能模块、设计算法功能模块、设计算法 详细设计详细设计 设计流程图设计流程图 编码编码 调试调试程序的基本结构程序的基本结构顺序结构顺序结构分支结构分支结构循环结构循环结构一、顺序结构一、顺序结构 语句的执行次序与存储次序相同语句的执行次序与存储次序相同 例例5-1内存中内存中TABLE开
2、始存放开始存放09的平方值,通过人机对话,当的平方值,通过人机对话,当任给定一个任给定一个X(09),查表得),查表得X的平方值,放在的平方值,放在AL中。中。DATASEGMENTTABLE DB 0,1,4,9,16,25,36,49,64,81 BUF DB Please input one number:,0DH,0AH,$DATA ENDSSTACK SEGMENT PARA STACK STACK ST1DB 50 DUP(?)(?)TOP LABEL WORDSTACK ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS
3、: STACK START: MOV AX,DATA ;送数据段段地址;送数据段段地址 MOV DS,AX MOV AX,STACK ;送堆栈段段地址;送堆栈段段地址 MOV SS,AX MOV SP, OFFSET TOP ;堆栈段偏移量送;堆栈段偏移量送SP MOV BX,OFFSET TABLE ;平方表有效地址;平方表有效地址送送BX NEXT: MOV DX,OFFSET BUF ;提示输入一个数;提示输入一个数 MOV AH,9 ; 9号功能调用,(显示字符串)号功能调用,(显示字符串) INT 21H MOV AH,1 ;1号功能调用号功能调用,(输入字符并显示)输入字符并显示)
4、 INT 21H ;键入数送入;键入数送入AL AND AL, 0FH ;屏蔽高四位;屏蔽高四位 XLAT ;查表得平方值送;查表得平方值送AL MOV AX,4C00H ;带参数返回;带参数返回DOS INT 21H RET ;返回;返回DOS MAIN ENDP ;过程;过程MAIN结束结束 CODE ENDS ;代码段结束;代码段结束 END START ;汇编结束;汇编结束 二、分支结构二、分支结构在程序的特定点,根据不同的条件转在程序的特定点,根据不同的条件转向执行不同的语句。分支是通过条件向执行不同的语句。分支是通过条件转移指令实现的。转移指令实现的。分支的类型分支的类型1.两路分
5、支两路分支2.多分支多分支YN例例5-2:在以在以BUF为首地址的内存,存放着一个长度为为首地址的内存,存放着一个长度为N(N39H(AL) 41H(AL)5AHDH+1DL+1(CX)=0修改修改BX及及(CX)-1NNNNNYYYYYADH送内存送内存ADL送内存送内存AL=N-DH-DLAL送内存送内存RET2.多分支多分支1)简单的实现方法简单的实现方法 MOV AH,1 INT 21H ;1号功能调用,键盘输入号功能调用,键盘输入 CMP AL,1 JE P1 ;键值为;键值为31H,转,转P1 CMP AL,2 JE P2 ;键值为;键值为32H,转,转P2 CMP AL,8 JE
6、 P8 ;键值为;键值为38H,转,转P8 JMP ST ;非法键,转停机;非法键,转停机P1: ; 1号键加工子程序号键加工子程序 P2: ; 2号键加工子程序号键加工子程序 P8: ;8号键加工子程序号键加工子程序 ST: HLT例例5-3:有:有8个加工子程序,入口个加工子程序,入口地址分别为地址分别为P1,P2, P8。编。编程实现检测键盘输入命令,使系程实现检测键盘输入命令,使系统分别转向统分别转向8个加工子程序。个加工子程序。=1?NYYY.NN=2?=8?2)用跳转表实现多分支用跳转表实现多分支跳转表:表中包括每个分支的入口地址、跳转指令或关键字。跳转表:表中包括每个分支的入口地
7、址、跳转指令或关键字。根据表内入口地址分支根据表内入口地址分支:P1LP1HP2LP2H.BASEBASE+2Pn-1Pn开始开始输入键值输入键值AL表首地址表首地址BX求偏移量求偏移量计算地址计算地址取得入口地址并跳转取得入口地址并跳转AND AL,0FHDEC ALADD AL,ALADD BX,AXJMP WORD PTR BXBASE DW P1, P2,P8MOV BX, OFFSET BASE 跳转表中存放着入口地址跳转表中存放着入口地址 根据表内指令分支根据表内指令分支P1LP1HP2LP2HBASE.Pn-1PnJMPJMPMOV AH,1 ;键入到;键入到ALINT 21HA
8、ND AL,0FHMOV AH,0DEC ALMOV BL,ALADD AL,ALADD AL,BL ;计算偏移量;计算偏移量MOV BX,OFFSET BASEADD BX,AX ;得转移地址;得转移地址JMP BX ;转入转移指令;转入转移指令跳转表中存放着转移指令跳转表中存放着转移指令 根据关键字分支根据关键字分支跳转表中存放关键字及相应分支地址跳转表中存放关键字及相应分支地址P1LP1HP2LP2HBASE.Pn-1Pn3132开始开始输入关键字输入关键字关键字关键字=0?与表内关键字比较与表内关键字比较相等?相等?转移转移Y表首地址送表首地址送BXN指针加指针加3NY关键字合法?关键
9、字合法?例例5-4首地址为首地址为BUFFER的数组已按升序排好,长度为的数组已按升序排好,长度为N(=10),在数组),在数组中查找数中查找数M(=80),若找到则从数组中删掉,否则将它插入正确的),若找到则从数组中删掉,否则将它插入正确的位置,位置,DX中记录数组最后的长度。中记录数组最后的长度。初始化:初始化:MAX;NCX,DX;BUFFERDI;CLD:增量修改指:增量修改指针针9810253698908270585348AX CX=9AX CX=8AX CX=7AX CX=6AX CX=5AX CX=4AX CX=3AX CX=2AX CX=1AX CX=0AX=80 CX=10A
10、X BUFFERSI ?9082AX BUFFERSI-2?AX BUFFERSI-2 ?80DX=11AX BUFFERSI-2 ?数组中无数组中无M10253698908070585348AX CX=9 DI=BUFFER+2AX CX=8 DI=BUFFER+4AX CX=7 DI=BUFFER+6AX CX=6 DI=BUFFER+8AX CX=5 DI=BUFFER+AAX CX=4 DI=BUFFER+CAX CX=3 DI=BUFFER+EAX = CX=2 DI=BUFFER+10AX=80 CX=10 DI=BUFFER9098BX=DI=BUFFER+10 DI-2 CX-
11、1=1BX=DI+2=BUFFER+12 DI-2 CX-1=0DX=9数组中有数组中有M例例4-68流程图流程图初始化初始化串扫描查找串扫描查找找到找到(CX)=0Y关键字关键字SI设置串尾比较指针设置串尾比较指针SIN数组元素下移数组元素下移修改比较指针修改比较指针SINDI 所指元素上移所指元素上移修改比较指针修改比较指针DI(CX)-1=0NN插在插在SI所所指单元后指单元后数组长度数组长度+1Y结束结束数组长度数组长度-1YY循环次数约束循环次数约束三、循环结构三、循环结构 重复执行一段程序重复执行一段程序 两种结构形式两种结构形式 先执行,后判断先执行,后判断 先判断,后执行先判断
12、,后执行 组成组成 初始化初始化 设置循环计数值,设置循环计数值,变量初值变量初值 循环体循环体 修改参数修改参数 循环控制循环控制初始化初始化入口入口循环体循环体修改参数修改参数循环控制循环控制出口出口初始化初始化入口入口循环体循环体修改参数修改参数循环控制循环控制出口出口 使用使用LOOP,循环次数由计数器决定,循环次数由计数器决定 使用条件转移指令实现使用条件转移指令实现 单循环与多重循环单循环与多重循环例例5-5存储在存储在BLOCK为首地址内为首地址内存中存中100个个16bit带符号数,带符号数,找出最大值后存在找出最大值后存在MAX单元单元中。中。BLOCKAXCMPMOVBLO
13、CK首地址首地址BX第一个被比较字第一个被比较字AX字地址修改字地址修改比较次数比较次数CX(CX)-1CX(CX)=0(AX)(BX)比较比较 CMP AX,BXAGAIN初初始始化化字地址修改字地址修改NEXTYJGN (BX) (AX)N送结果送结果 (AX) MAXHLTY NAME FOUND;定义程序名;定义程序名DATA SEGMENT;数据段说明开始;数据段说明开始BLOCK DW65C8H,35,694AH,0A398H ;串数据;串数据COUNT EQU (BLOCK)/21 ;EQU为定义数据,可以用表为定义数据,可以用表 达式。达式。 ;为当前地址。;为当前地址。COU
14、NT为比较次数。为比较次数。MAX DW? ;设置;设置MAX的内存空间的内存空间DATA ENDS ;数据段说明结束;数据段说明结束STACK SEGMENTSTACK;堆栈段说明开始;堆栈段说明开始 DB 100 DUP(?);保留;保留100字节堆栈空间字节堆栈空间STACK ENDS;堆栈段说明结束;堆栈段说明结束CODE SEGMENT;代码段说明开始;代码段说明开始 ASSUMECS:CODE,DS:DATA,SS:STACK ;程序中使用段设定;程序中使用段设定FOUND PROC FAR;作为;作为DOS系统的子程序说明系统的子程序说明BEGIN: PUSH DS ; MOV
15、AX,0 PUSH AX ; MOV AX,DATA MOV DS,AX;设置本程序的;设置本程序的DS LEA BX,BLOCK;本程序的运行程序开始;本程序的运行程序开始 MOV AX,BX INC BX INC BX MOV CX,COUNTAGAIN: CMP AX,BX JG NEXT MOV AX,BXNEXT: INC BX INC BX LOOP AGAIN MOV MAX,AX;本程序运行结束;本程序运行结束 RETFOUND ENDP;子程序结束说明;子程序结束说明CODE ENDS;代码段结束说明;代码段结束说明 END BEGIN;编译结束说明;编译结束说明例例469多
16、重循环多重循环 各重循环之间不能交叉各重循环之间不能交叉 可以从内循环跳到外循环,但不能外循环直接跳入内循环可以从内循环跳到外循环,但不能外循环直接跳入内循环 避免死循环避免死循环例例5-6:气泡法排序气泡法排序。存储器。存储器数据段从数据段从BUF开始存放一个开始存放一个数组,数组中第一个字中存数组,数组中第一个字中存放该数组的长度放该数组的长度N,编制一个,编制一个程序使此数组中的数据按由程序使此数组中的数据按由小到大的次序排列。小到大的次序排列。初始化:初始化:设置段寄存器设置段寄存器首字地址首字地址BUF DI;循环次数循环次数N CXAADATA SEGMENT BUF DW N,1
17、5,37,ADATA ENDSACODE SEGMENT ASSUME CS:ACODE,DS:ADATAMAIN PROC FARSTART: MOV DI, OFFSET BUF MOV CX, DI DEC CX取数取数EiEi Ei+1?修改变址值修改变址值: DI+2L2交换交换, 置交换标志置交换标志1 BHCX-1=0?YP181交换标志交换标志0?YL1CX DX, 设置交换标志设置交换标志 0BHANNBUFDI, DX CXCX-1=0?返回返回YNNYL1:MOVDX, CXMOVBH, 0L2:ADDDI, 2MOVAX, DICMPAX, DI+2JBECONT1XC
18、HG AX, DI+2MOVDI, AXMOVBH, 1CONT1:LOOP L2MOVDI, OFFSET BUFMOVCX, DXLOOP L1STOP: RET 序号 数据串 第一遍 第二遍 第 6 遍 BUFFER 0 15 15 15 15 BUFFER 2 1 37 37 37 37 BUFFER 4 2 8600/2198H 8600 8600 76H BUFFER 6 3 A768H 3412H 1256H 1256H BUFFER 8 4 3412H 1256H 76H 8600 BUFFER 10 5 1256H 76H 3412H 3412H BUFFER 12 6 76H A768H A768H A768H