1、第五章 程序设计基本技术,5.1 一般步骤,一、分析问题,建立数学模型理解用户意图,找出规律性的东西,建立数学模型。,二、确定算法找出计算机解决问题的方法步骤。,三、绘制流程图将复杂任务分解成小的模块,再对模块分解,直至画出细致的流程图。,第五章 程序设计基本技术,5.1 一般步骤,四、编程根据流程图编写元程序,并分配好内存和寄存器。进行程序设计时,采用自上而下的方法,将大程序分成若干个模块,有一个为主模块,其余为子模块。,用户程序要求有一个正确的格式,以便能够返回DOS,第五章 程序设计基本技术,5.1 一般步骤,格式1:将用户程序设置成一个过程,类型为FAR,第五章 程序设计基本技术,5.
2、1 一般步骤,格式2:利用中断指令INT 21H返回操作系统,data segment d1 db 12h,34h,56h,78h,9ah,0abh,0bch,0cdh d2 db 0cdh,0bch,0abh,9ah,78h,56h,34h,12h data ends stack segment stack sta db 80 dup(?) stack ends code segmentassume cs:code,ds:data,ss:stack start:mov ax,datamov ds,axmov bx,0bac1hmov ax,1234hadd ax,bxmov ah,4chin
3、t 21h code ends end start,第五章 程序设计基本技术,5.1 一般步骤,五、程序调试用DEBUG调试程序,检验结果是否正确。,六、试运行和分析结果检验程序是否达到用户的要求,并用边缘数据检验程序是否正确。,七、整理资料,第五章 程序设计基本技术,程序设计的基本方法,基本程序结构:顺序结构 循环结构分支结构 子程序结构复合结构:多种程序结构的组合,第五章 程序设计基本技术,5.2 顺序程序设计,顺序结构:程序从开始到结束,按照语句顺序执行,流程图中只有开始框、执行框和结束框。,例:求两个无符号数的平均值,两个数放在X单元和Y单元中,平均值放在Z单元中。,data segm
4、ent data ends stack segment stack sta db 80 dup(?) stack ends code segmentassume cs:code,ds:data,ss:stack start:mov ax,datamov ds,axmov ah,4chint 21h code ends end start,x db 6 y db 8 z db ?,mov al,x add al,y shr al,1 mov z,al,第五章 程序设计基本技术,5.3 分支程序设计,分支: 依据不同的条件,选择不同的程序段,实现对被加工对象的不同处理。实现分支的关键: 选择合适的
5、指令影响状态标志。CF、ZF、SF、OF、PF、AF 选用恰当的跳转指令判断标志,实现分支。 有条件转移指令与无条件转移指令相互配合。,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序,简单分支程序结构,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序,简单分支程序结构,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序,常用的分支判断,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序, 比较两数是否相等(设两数在 AL 和 BL 中):,CMP AL,BL JZ K1,常用的分支判断,第五章 程序设计基本技术,5.3 分支程序设计
6、,一、简单分支程序, 比较两数是否相等(设两数在 AL 和 BL 中):,CMP AL,BL JNZ K2,常用的分支判断,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序, 比较两数是否相等(设两数在 AL 和 BL 中):,CMP AL,BL JNZ K3,常用的分支判断,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序, 判断某数是否为0(设该数在 AL 中):,AND AL,AL JZ N1,常用的分支判断,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序, 比较两个无符号数的大小(设两数在 AL 和 BL 中):,CMP AL,BL J
7、AE M1,常用的分支判断,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序, 比较两个无符号数的大小(设两数在 AL 和 BL 中):,CMP AL,BL JB M2, 判断某数的某位(或某几位)是否为1或为0(设该数在 AL 中):,常用的分支判断,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序,TEST AL,80H JZ L1,程序设计举例,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序,计算分段函数 设 X 存于 DA1 中,Y 存于 RES 中。,data segment data ends stack segment stack
8、 sta db 80 dup(?) stack ends code segmentassume cs:code,ds:data,ss:stack start:mov ax,datamov ds,ax dret:mov ah,4chint 21h code ends end start,DA1 DB -2 RES DB ?,MOV AL,DA1OR AL,ALJZ ZEROMOV RES,0FFHJMP DRET ZERO:MOV RES,0,例 编写计算程序计算行李费:行李重量为P、计费为 M。当 P 大于 50 时, M = 2 * 50 + ( P 50 ) * 3 ;否则, M = 2
9、* P设 P 存于 DATA 单元, M 存于 RESULT 单元 。,程序设计举例,第五章 程序设计基本技术,5.3 分支程序设计,一、简单分支程序,当 P 大于 50 时,M = 2 * 50 + ( P 50 ) * 3 ;否则,M = 2 * P,MOV AL,DATACMP AL,50JBE KD1MOV BL,ALADD AL,BLMOV CL,ALMOV AL,BLSUB AL,50ADD AL,CLMOV RESULT,ALJMP DRET KD1: ADD AL,ALMOV RESULT,AL DRET:MOV AH,4CHINT 21H,当 P 大于 50 时,M = 2
10、* 50 + ( P 50 ) * 3 ; 否则,M = 2 * P,MOV AL,DATAMOV AL,BLADD AL,BLMOV CL,ALMOV AL,BLCMP AL,50JBE KD2SUB AL,50ADD AL,CLMOV CL,AL KD2: MOV AL,CLMOV RESULT,ALHLT,第五章 程序设计基本技术,5.3 分支程序设计,二、多分支程序,case 1 case 2 case n,?,?,case 1 case 2 case n,CASE 结构 IF-THEN-ELSE 结构,第五章 程序设计基本技术,用比较转移指令实现选择分支,例:求解符号函数,data
11、segment data ends stack segment stack sta db 80 dup(?) stack ends code segmentassume cs:code,ds:data,ss:stack start:mov ax,datamov ds,ax dret:mov ah,4chint 21h code ends end start,x db -2 y db ?,mov al,x cmp al,0 jge big mov y,-1 big:jz eqz Mov y,1 eqz:mov y,0,mov al,x cmp al,0 jge big mov y,-1 jmp
12、dret big:jz eqz Mov y,1 jmp dret eqz:mov y,0,5.3 分支程序设计,第五章 程序设计基本技术,5.3 分支程序设计,用跳转表实现选择分支,1、跳转表内为分支地址,例:某投料机可生产8种产品,每种产品须投料的数量不同,所以需8种控制程序,每个控制程序有一个入口地址,占2个字节,由这些入口地址形成一地址表,首地址为table_base,产品号定义为07。,每种产品的入口地址为:table_base+产品号*2,data segment table_base dw p0,p1,p2,p3,p4,p5,p6,p7 num equ 3 data ends st
13、ack segment stack sta db 80 dup(?) stack ends code segmentassume cs:code,ds:data,ss:stack start:mov ax,datamov ds,axmov bx,numshl bx,1mov ax,table_basebxjmp ax P0: jmp dret P1: jmp dret P7: dret:mov ah,4chint 21h code ends end start end start,第五章 程序设计基本技术,5.3 分支程序设计,2、跳转表内为跳转指令,每种产品的入口地址为:table_base
14、+产品号*3,表内存放为跳转指令,要求跳转指令的指令代码长度一致。,用跳转表实现选择分支,第五章 程序设计基本技术,5.4 循环程序设计,一、循环程序的结构形式,1、DO_WHILE形式”先判断后执行”,把循环判断的条件放在循环入口,先判断条件,再执行循环体。,2、DO_UNTIL形式”先执行后判断”,先执行一次循环体,再判断,满足循环条件,退出循环,不满足继续循环。,3、组成:初始化、循环体、循环控制、循环结束。,正计数例: N EQU 100MOV BX,0 ;BX做计数器LOP: INC BXCMP BX,NJNZ LOP,或LOOP LOP,第五章 程序设计基本技术,5.4 循环程序设
15、计,一、循环程序的结构形式,倒计数例: MOV CX,N ;CX做计数器LOP: DEC CXJNZ LOP,第五章 程序设计基本技术,5.4 循环程序设计,二、单循环程序设计,例:内存Y单元存放数n,将数n中1的个数统计出来放在COUNT中。,第五章 程序设计基本技术,5.4 循环程序设计,二、单循环程序设计,例:内存Y单元存放数n,将数n中1的个数统计出来放在COUNT中。,例:设有数组X和Y。 X数组中有X1,X10; Y数组中有Y1,Y10。 试编制程序计算: Z1=X1+Y1 Z2=X2+Y2 Z3=X3-Y3 Z4=X4-Y4 Z5=X5-Y5 Z6=X6+Y6 Z7=X7-Y7
16、Z8=X8-Y8 Z9=X9+Y9 Z10=X10+Y10,第五章 程序设计基本技术,5.4 循环程序设计,二、单循环程序设计,Z1=X1Y1 Z6=X6Y6Z2=X2Y2 Z7=X7Y7Z3=X3Y3 Z8=X8Y8Z4=X4Y4 Z9=X9Y9Z5=X5Y5 Z10=X10Y10设加用0、减用1 逻辑尺: 0000000011011100 Z10 Z1,第五章 程序设计基本技术,5.4 循环程序设计,二、单循环程序设计,data segment x dw 10h,20h,30h,40h,50h,60h,70h,80h,90h,100h y dw 11h,22h,33h,44h,55h,66
17、h,77h,88h,99h,100h z dw 10 dup (?) logic_rule dw 00dch ; 000011011100B(逻辑尺) data ends code segmentassume cs:code,ds:data start: mov ax,datamov ds,axmov bx,0mov cx,10mov dx,logic_rulenext: mov ax,xbxshr dx,1 ;逻辑尺右移jc sub1add ax,ybx,jmp short res sub1: sub ax,ybx res: mov zbx,axadd bx,2loop nextmov ah
18、,4chint 21h code endsend start,第五章 程序设计基本技术,5.4 循环程序设计,二、单循环程序设计,第五章 程序设计基本技术,5.4 循环程序设计,三、多重循环程序设计,注:内循环必须完整的包含在外循环内,不能直接从外循环跳到内循环。,例:从键盘读入3-9间的数字,输出用 * 组成的三角形。如读入数字为4,输出为,当AH=9时,INT 21H 的功能为显示字符串,首地址放在DX中; 当AH=2时,INT 21H 的功能为显示字符,字符放在DL中; 当AH=1时,INT 21H 的功能为由键盘输入字符,放在AL中;,第五章 程序设计基本技术,5.4 循环程序设计,第
19、五章 程序设计基本技术,5.4 循环程序设计,是否在39的范围,若符合范围,取出数据且换行,内循环,显示“ * ”,外循环,显示多少行,第五章 程序设计基本技术,5.5 子程序设计,一、子程序定义,子程序名 proc near (far)ret 子程序名 endp,注:调用程序和子程序同在一个代码段,用near属性调用程序和子程序不在同一个代码段,用far属性子程序可以嵌套,第五章 程序设计基本技术,5.5 子程序设计,二、子程序调用,CALL 子程序名,三、寄存器的保护和恢复,在主程序中实施保护和恢复:保护和恢复子程序调用前后主程序要用到的寄存器。 在子程序中实施保护和恢复:保护和恢复子程序
20、中要用到的寄存器,但对传递参数的寄存器不需要保护。,第五章 程序设计基本技术,5.5 子程序设计,四、调用程序与子程序间的参数传递,1、不带参数的子程序,第五章 程序设计基本技术,5.5 子程序设计,四、调用程序与子程序间的参数传递,2、通过寄存器传递参数适用于参数较少的程序,例:把一组压缩的BCD码转换为十六进制数,并在显示器上显示出来。,当AH=2时,INT 21H 的功能为显示字符,字符放在DL中,data segment da1 dw 12h,64h,1234h,100h count dw 4 data ends,lea si,da1mov cx,count lo1:mov bx,si
21、call dectohexcall displaydec cxjz dretinc siinc sijmp lo1,第五章 程序设计基本技术,5.5 子程序设计,四、调用程序与子程序间的参数传递,2、通过寄存器传递参数适用于参数较少的程序,十二子程序:,Bx中存放欲转换的BCD码,Bx中存放转换后的结果,dectohex procpush cxpush simov si,10mov ch,4mov cl,4mov ax,0 next:rol bx,clmov di,bxand di,000fh,mul siadd ax,didec chjnz nextmov bx,axpop sipop cx
22、ret dectohex endp,第五章 程序设计基本技术,5.5 子程序设计,四、调用程序与子程序间的参数传递,2、通过寄存器传递参数适用于参数较少的程序,显示子程序:,第五章 程序设计基本技术,5.5 子程序设计,四、调用程序与子程序间的参数传递,3、通过地址表传递参数适用于参数较多的情况,例:将array中的所有数据相加,结果置于sum中,数据长度已存于count中。,DATA SEGMENT ARRAY DW 2,5,19,22H, 1234H COUNT DW ($-ARRAY)/2 SUM DW ? DATA ENDS,DATA SEGMENT ARRAY1 DW 2,5,19,
23、22H,1234h COUNT1 DW ($-ARRAY1)/2 array2 dw 1234h,4567h,89h,6782h count2 dw ($-array2)/2 SUM DW ?,? DATA ENDS,第五章 程序设计基本技术,DATA SEGMENT ARRAY1 DW 2,5,19,22H,1234h COUNT1 DW ($-ARRAY1)/2 array2 dw 1234h,4567h,89h,6782h count2 dw ($-array2)/2 SUM DW ?,? TABLE DW 3 DUP(?) DATA ENDS,3、通过地址表传递参数,在主程序中建立地址
24、表,将要传递给子程序的参数的地址全部置于地址表中。 将地址表的首地址通过寄存器传递给子程序。,第五章 程序设计基本技术,3、通过地址表传递参数,5.5 子程序设计,CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXMOV TABLE,OFFSET ARRAY1MOV TABLE+2,OFFSET COUNT1MOV TABLE+4,OFFSET SUMMOV BX,OFFSET TABLECALL ADD_ARRAYmov table,offset array2mov table+2,offset count2mov
25、table+4,offset sum+2mov bx,offset tablecall add_arrayMOV AH,4CHINT 21H CODE ENDS END START,建立地址表,表的首地址置于BX中,利用BX传递地址表首地址,第五章 程序设计基本技术,5.5 子程序设计,四、调用程序与子程序间的参数传递,3、通过地址表传递参数,第五章 程序设计基本技术,5.5 子程序设计,四、调用程序与子程序间的参数传递,4、通过堆栈传递参数适用于参数较多的情况,在主程序调用子程序之前,压栈要传递给参数,然后调用子程序。 在子程序中将所用参数出栈。 子程序返回时,释放参数所占的堆栈内存。,例:
26、将array中的所有数据相加,结果置于sum中,数据长度已存于count中。,第五章 程序设计基本技术,第五章 程序设计基本技术,5.5 子程序设计,4、通过堆栈传递参数,指令格式: n 执行的操作:(),()()() n,第五章 程序设计基本技术,5.6 DOS和BIOS功能调用,BIOS调用是在较低层次上的调用,因为BIOS独立于任何操作系统,程序的可移植性差,但运行效率高。 DOS调用是在较高层次上的调用,程序的可移植性好,但运行效率较低。,一、DOS功能调用,INT n (n=202FH),1、DOS中断使用方法:,设置入口参数执行INT n分析出口参数,第五章 程序设计基本技术,5.
27、6 DOS和BIOS功能调用,一、DOS功能调用,2、DOS功能调用:,INT 21H,设置入口参数功能号送AH INT 21H分析出口参数,入口参数一般以DX或DL给出,出口参数一般放在AX或AL中,第五章 程序设计基本技术,5.6 DOS和BIOS功能调用,一、DOS功能调用常用有关键盘的系统功能调用,5.6 DOS和BIOS功能调用,一、DOS功能调用常用有关显示器输出的系统功能调用,第五章 程序设计基本技术,第五章 程序设计基本技术,5.6 DOS和BIOS功能调用,一、DOS功能调用打印输出功能调用,第五章 程序设计基本技术,5.6 DOS和BIOS功能调用,一、DOS功能调用,例:
28、要求从键盘输入一十进制数,以回车键作为一个数据的输入结束,转换为十六进制数后,在显示器上显示出来,然后再读数,再显示,直到遇到CTRL+C为止。,data segment da1 db PLEASE INPUT A NUMBER:$ derr db 07,07,08,$ data ends code segmentassume cs:code,ds:data,ss:stack start:mov ax,datamov ds,ax lo1:call keyincall ctrfcall displayjmp lo1 dret:mov ah,4chint 21h code ends end sta
29、rt,第五章 程序设计基本技术,5.6 DOS和BIOS功能调用,一、DOS功能调用,keyin proclea dx,da1mov ah,9int 21hmov bx,0 newch:mov ah,1int 21hcmp al,0dhjz exitcmp al,30hjl errcmp al,39hjg err,sub al,30hcbwxchg ax,bxmov cx,10mul cxadd bx,axjmp newch err:lea dx,derrmov ah,9int 21hjmp newch exit:ret keyin endp,键盘输入子程序:,第五章 程序设计基本技术,5.6
30、 DOS和BIOS功能调用,一、DOS功能调用,显示子程序:,二、BIOS功能调用,INT n (n=51FH),第五章 程序设计基本技术,5.6 DOS和BIOS功能调用,设置入口参数置功能号 INT n分析出口参数,INT 10H显示器 INT 13H磁盘 INT 14H通信 INT 16H键盘 INT 17H打印机 INT 1AH时钟 等,第五章 程序设计基本技术,5.6 DOS和BIOS功能调用,例:在显示器上输出“Who are you?”,然后把键盘输入信息送入内存nam中,并重新显示输入信息。,第五章 程序设计基本技术,5.4 宏指令,1、宏定义的格式,宏指令名 MACRO 形式
31、参数表宏体ENDM,例:定义一个宏,将一个寄存器中的数左移NUM位,SHIFT MACRO REG,NUMMOV CL,NUMSHL REG,CLENDM,第五章 程序设计基本技术,5.4 宏指令,2、宏调用,格式:宏指令名 实参数1,实参数2,,注:实参数之间以逗号分割。实参与形参在顺序上对应。若实参的个数大于形参的个数,则多余的实参被忽略;若实参的个数小于形参的个数,则多余的形参为空。,CODE SEGMENG SHIFT AL,4 SHIFT BL,3 CODE ENDS,第五章 程序设计基本技术,5.4 宏指令,3、宏指令的消除,格式:PURGE 宏指令名,宏指令名, ,一条PURGE
32、可以消除一条或多条宏指令,4、宏指令与子程序的区别,宏指令是为简化书写,而在汇编的过程中把宏体插入到宏调用处,宏指令不能简化程序,但不需断点的保护和恢复,指令执行速度快,但占内存大。 子程序可以减少目标代码,占用内存少,但须断点的保护和恢复,指令执行时间长。,第五章 程序设计基本技术,sh macro nummov cl,numshl al,clendm data segment d1 dB ABCDEF data ends code segmentassume cs:code,ds:data bg:mov ax,datamov ds,axlea si,d1MOV al,SIsh 1mov a
33、h,4Chint 21h code ends end bg,宏指令:,sh macro nummov cl,numshl al,clendm0000 data segment0000 41 42 43 44 45 46 d1 dB ABCDEF0006 data ends0000 code segmentassume cs:code,ds:data0000 B8 - R bg:mov ax,data0003 8E D8 mov ds,ax0005 8D 36 0000 R lea si,d10009 8A 04 MOV al,SIsh 1000B B1 01 1 mov cl,1000D D2
34、 E0 1 shl al,cl000F B4 4C mov ah,4Ch0011 CD 21 int 21h0013 code endsend bg,data segment d1 dB ABCDEF data ends code segmentassume cs:code,ds:data bg:mov ax,datamov ds,axlea si,d1MOV al,SImov cl,1call shmov ah,4Chint 21h sh procshl ax,cl sh endp code ends end bg,子程序:,第五章 程序设计基本技术,0000 data segment000
35、0 41 42 43 44 45 46 d1 dB ABCDEF0006 data ends0000 code segmentassume cs:code,ds:data0000 B8 - R bg:mov ax,data0003 8E D8 mov ds,ax0005 8D 36 0000 R lea si,d10009 8A 04 MOV al,SI000B B1 01 mov cl,1000D E8 0004 call sh0010 B4 4C mov ah,4Ch0012 CD 21 int 21h0014 sh proc0014 D3 E0 shl ax,cl0016 sh endp0016 code endsend bg,