【教学课件】第六章子程序设计.ppt
《【教学课件】第六章子程序设计.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第六章子程序设计.ppt(69页珍藏版)》请在三一办公上搜索。
1、第六章 子程序设计,一、子程序的定义二、子程序的结构形式三、子程序的设计和调用四、子程序的参数传递方法五、子程序的嵌套和递归调用六、子程序的设计举例七、多模块程序设计八、汇编语言和高级语言的混合编程,一、子程序的定义,1、子程序的概念和特点2、子程序的定义3、子程序的调用和返回,1、子程序的概念和特点,子程序:把在程序中多次出现,具有独立功能的程序段写成程序模块,该模块可被多次调用,称之为子程序。,特点:可重复使用(调用)具有通用性(可通过入口参数实现)可浮动性(存放位置灵活)可递归性和可重入性,子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名 PROC NEAR/
2、FAR 过程名 ENDP其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。,2、子程序的定义,3、子程序的调用和返回,调用段内直接调用格式:CALL 子程序名功能:将子程序返回地址(断点)入栈 SPSP-2(SP)IP,并转到子程序入口地址去执行子程序。IPIP+(子程序入口地址与CALL之间的偏移量),例:段内直接调用,显示字符PCODE SEGMENTASSUME CS:CODESTART:CALL DISPMOV AH,4CHINT 21HDISP PROCMOV DL,PMOV
3、 AH,2INT 21HRET,DISP ENDPCODE ENDS END START,段内间接调用格式:CALL DST 或 CALL WORD PTR DST(DST为寄存器或字存储器)功能:断点入栈,转子程序执行。SPSP-2(SP)IP IP(EA)例:CALL BX CALL WORD PTR SI,段间直接调用格式:CALL FAR PTR DST(DST为子程序名)功能:段点(CS和IP)入栈,并转到子程序处执行。SPSP-2(SP)CSSPSP-2(SP)IPIP子程序入口地址的偏移地址CS子程序入口地址的段地址,例:段内间接调用,显示一个字符PCODE1 SEGMENTAS
4、SUME CS:CODE1START:CALL DISPMOV AH,4CHINT 21HCODE1 ENDSCODE2 SEGMENTASSUME CS:CODE2,DISP PROC FARMOV DL,PMOV AH,2 INT 21HRETDISP ENDPCODE2 ENDSEND START,段间间接调用例:CALL DWORD PTR BX CALL DWORD PTR ADDR,返回指令格式:RET功能:返回堆栈中存放的断点,并返回到CALL指令的后续指令继续执行。,二、子程序的结构形式,子程序设计考虑四部分:保护现场(保存寄存器原有的内容)、处理部分、恢复现场(恢复寄存器原有
5、的内容)、子程序的返回。,“现场”:子程序执行中要用到的寄存器。保护现场:一般通过压栈实现(进入子程序前)恢复现场:一般通过出栈实现(返回子程序前),1、子程序的调用方法说明,(1)子程序名:供调用时使用(2)入口参数:子程序执行需要的数据(3)出口参数(输出参数):说明子程序执行后结果存放在何处。(4)占用寄存器:说明子程序执行时需要使用那些寄存器。那些改变,那些不变。,注意:作为存放出口参数用的寄存器不能保护。,2信息的保护与恢复,例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROGPROCPUSHAX PUSHBX PUSHCX;保护现
6、场PUSHDX,POPDX POPCX POPBX;恢复现场 POPAX RET;返回断点处PROCENDP,三、子程序的设计和调用举例例6-2 多字节二进制数加法子程序,;子程序名:MBTADD;功能:两个多字节二进制相加;入口参数:SI,DI分别存放两个数的首地址,BX存放和的首地址,CX存放多字节数的长度。;出口参数:BX存放和的首地址,MBTADD PROC PUSH SIPUSH DIPUSH BXPUSH AXPUSH CXCLC;CF=0,保护现场,NEXT:MOV AL,SI ADC AL,DI MOV BX,AL INC SI INC DI INC BX LOOP NEXT
7、POP CX POP AX POP BX POP DI,POP SIRETMBTADD ENDP,返回现场,例:求最大公约数子程序。入口参数:AX,BX出口参数:CXMCDST PROCPUSH AXPUSH BXPUSH DXAGAIN:XOR DX,DXDIV BXAND DX,DXJZ EXIT,MOV AX,BX MOV BX,DX JMP AGAINEXIT:MOV CX,BXPOP DXPOP BXPOP AXRETMCDST ENDP,例6-3:将在BUFFER为首地址的缓冲区的一个字符串中的所有大写字母都转换成小写字母,并在屏幕显示出来。,程序清单如下:DATASEGMENTO
8、RG200HSTRINGDB ABsDFAIViop STRLENEQU$-STRING;字符串长度DATAENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA;设置数据段MOV DS,AX,MOV SI,OFFSET STRING;取串首地址赋给SI MOV CX,STRLEN;串长送CXCALLSTRDTX;调用子程序MOVDX,OFFSET STRING;打印转换后的字符串MOV AH,9INT 21HMOV AH,4CHINT 21H,;大小写转换子程序 STRDTXPROCNEAR PUSH AX PUSH CX PUSH S
9、I NEXT:MOV AL,SI CMPCX,0 JZEXIT CMPAL,A JBNEXT1 CMPAL,Z,JANEXT1 ADDAL,20H MOV SI,AL NEXT1:INC SI JMPNEXT EXIT:POPSI POPCX POPAX RETSTRDTXENDP CODEENDS ENDSTART,四、主程序与子程序参数传递方式,通过寄存器传递参数通过堆栈传递参数通过存储单元传递参数,1、通过寄存器传递参数,主程序将原始参数放入约定的寄存器,然后调用子程序;子程序把处理结果放入约定的寄存器,并返回主程序。,例6-5数据块传送子程序,分析:入口参数:源操作块首地址、目的块首地
10、址和块长度。分别用SI、DI和CX来传递参数。,DATA SEGMENTBLOCK1 DB 23H,45H,13H,2FH,1AH,94HLENS EQU$-BLOCK1BLOCK2 DB LENS DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX,MOV SI,OFFSET BLOCK1 MOV DI,OFFSET BLOCK2 MOV CX,LENS CALL MOVSTOK MOV AH,4CH INT 21HMOVSTOK PROC NEAR PUSH AXNEXT:MOV AL,S
11、I MOV DI,AL INC SI,INC DI LOOP NEXT POP AX RETMOVSTOK ENDPCODE ENDSEND START,例:在ADRM和ADRN单元中分别存放两个正整数M、N,求最大公约数,并将结果存入RESULT单元中。,入口参数:AX,BX出口参数:CX,算法:(1)判断如MN,转(2),否则交换M、N(2)M/N得到余数R(3)判断若R=0,则N为最大公约数,否则(4)更新被除数和除数,MN,NR,转(2)执行。,2、通过堆栈传递参数,主程序的入口参数用堆栈保存,不占用存储单元,在子程序中弹出入口参数,执行完子程序后,释放堆栈空间。,例6-5用堆栈传递参
12、数,实现数据块传送。,入口参数:源数据块首地址,目的数据块首地址及数据块长度。均用寄存器AX把3个参数压栈。,DATA SEGMENTBLOCK1 DB 23H,45H,13H,2FH,1AH,94HLENS EQU$-SOUCE BLOCK2 DB LENS DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX,MOV AX,OFFSET BLOCK1PUSH AXMOV AX,OFFSET BLOCK2PUSH AXMOV AX,LENSPUSH AXCALL MOVSTOKMOV AH,4
13、CHINT 21H,MOVSTOK PROC NEARPUSH SI PUSH DI PUSH CXPUSH BP MOV BP,SPMOV SI,BP+14 MOV DI,BP+12 MOV CX,BP+10,LOP1:MOV AL,SI MOV DI,ALINC SIINC DILOOP LOP1 RETMOVSTOK ENDPCODE ENDSEND START,例:利用堆栈传递参数,实现对2个已定义数组分别求和。主程序与子程序不在同一代码段中。,入口参数:数组的首地址和数组长度。使用寄存器AX将入口参数压栈。,DATA SEGMENTARYA DB 06H,33H,0AH,88H,13
14、HSUMA DW?ARYB DB 9FH,97H,34H,22H,33,13HSUMB DW?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX,MOV AX,SUMA-ARYAPUSH AXMOV AX,OFFSET ARYAPUSH AXCALL SUMMOV AX,SUMB-ARYBPUSH AXMOV AX,OFFSET ARYBPUSH AXCALL SUM,MOV AH,4CHINT 21HCODE ENDS,PROCE SEGMENTASSUME CS:PROCE,DS:DATASUM PR
15、OC FARPUSH AXPUSH BXPUSH CXPUSH BPMOV BP,SPPUSHFMOV CX,BP+14MOV BX,BP+12,MOV AX,0LOP1:ADD AL,BXADC AH,0INC BXLOOP LOP1MOV BX,AXPOPFPOP BPPOP CXPOP BXPOP AX,RET 4SUM ENDPPROCE ENDSEND START,3、用存储单元传递参数,主程序中入口参数送入存储单元,子程序中取出入口参数进行处理,执行结果存入存储单元。,例6.7 同例6.5 用存储器参数传递法编写程序,DATA SEGMENTBLOCK1 DB 23H,45H,13
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 第六 章子 程序设计

链接地址:https://www.31ppt.com/p-5663552.html