第六章子程序设计V2016_第1页
第六章子程序设计V2016_第2页
第六章子程序设计V2016_第3页
第六章子程序设计V2016_第4页
第六章子程序设计V2016_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、Wu Qiulan1第六章 子程序的设计6.2 子程序调用和返回指令6.3 子程序的结构形式6.4 子程序的设计和调用6.5 子程序设计举例6.1 子程序的概念与特性Wu Qiulan2第六章 子程序的设计本章重点: 子程序的概念和特性 子程序的设计与调用 子程序的参数传递方法Wu Qiulan3第六章 子程序的设计DATA SEGMENT STR DB ASAAAASAAAAAA CNT EQU $-STR RESU DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX 引例:统计字符串中字符A

2、的个数,存入RESU字节单元, 并以16进制显示。 MOV CX,CNT MOV BX,0 MOV DX,0COUNT:CMP STRBX,A JZ A_NO JMP NEXTA_NO: INC DLNEXT: INC BX LOOP COUNT MOV RESU,DL MOV CL,4 SHR DL,CL CMP DL,9 JBE NEXT1 ADD DL,7NEXT1:ADD DL,30H MOV AH,2 INT 21H ;显示高位 MOV DL,RESU AND DL,0FH CMP DL,9 JBE NEXT2 ADD DL,7NEXT2:ADD DL,30H MOV AH,2 IN

3、T 21H ;显示低位 MOV DL,H MOV AH,2 INT 21H ;显示H MOV AH,4CH INT 21HCODE ENDS END STARTSHR执行操作: 0 OPR CFDISP PROC CMP DL,9 JBE NEXT1 ADD DL,7NEXT1:ADD DL,30H MOV AH,2 INT 21H RETDISP ENDPCODE ENDS END START MOV CL,4 SHR DL,CL CALL DISP MOV DL,RESU AND DL,0FH CALL DISP MOV DL,H MOV AH,2 INT 21H MOV AH,4CH I

4、NT 21HWu Qiulan66.1 子程序的概念与特性 1、子程序:可多次调用,能完成特定功能的程序模块。2、主程序:调用子程序的程序称主程序。3、转子:从主程序转移到子程序的过程称转子。4、返主:子程序执行完,返回到主程序的过程称返主。 一、概念调用子程序调用子程序主程序子程序返回主程序和子程序的关系转子返主转子返主二、子程序的特性:一个子程序占一段存储区,可多次调用。:子程序可放在存储器任意处。:子程序可调用其本身。:子程序可被中断,在中断处理中又可 被中断服务程序调用。1、重复性3、可浮动性2、通用性4、可递归性5、可重入性:功能通用。Wu Qiulan96.2 子程序调用和返回指令

5、一、段内调用6.2.1 调用指令格式:CALL DST功能1、SP2SP,IP(SP)(断点地址入栈)2、IP偏移量(子程序入口地址与CALL指令)IP注:子程序调用,隐含使用堆栈保存返回地址。SP SP IP*SSWu Qiulan10格式:CALL FAR PTR DST(DST子程序名)1、SP2SP,CS(SP) SP2SP,IP(SP)(断点地址入栈)2、子程序入口地址的偏移量IP 子程序入口地址的段地址CS功能三、段间调用SP SP CSIP*SSSP CODE SEGMENT ASSUME CS:CODESTA : MOV DL, T CALL DISP MOV DL, A CA

6、LL DISP MOV AH, 4CH INT 21H例6.1:段内直接调用,显示字符TA。DISP PROC MOV AH, 2 INT 21H RETDISP ENDPCODE ENDS END STACODE1 SEGMENT ASSUME CS:CODE1START : MOV DL, T CALL FAR PTR DISP MOV DL, A CALL FAR PTR DISP MOV AH, 4CH INT 21HCODE1 ENDS例6.2:段间直接调用,显示字符TA。CODE2 SEGMENT ASSUME CS:CODE2DISP PROC FAR MOV AH, 2 INT

7、 21H RETDISP ENDPCODE2 ENDS END STARTWu Qiulan13一、段内返回格式:RET功能:(SP)IP,SP+2SP6.2.2 返回指令二、段内带立即数返回格式:RET n功能:(SP)IP,SP+2SP, SP+nSP格式:RET三、段间返回四、段间带立即数返回格式:RET n功能(SP)IP,SP+2SP(SP)CS,SP+2SP, SP+nSP功能(SP)IP,SP+2SP(SP)CS,SP+2SP注:带立即数返回指令中的n一般为偶数,主要用来去掉 堆栈中的一些无用数据。Wu Qiulan156.3 子程序的结构形式6.3.1 子程序的定义格式格式:子

8、程序名 PROC NEAR/FAR RET 子程序名 ENDP注:1、NEAR属性:调用程序和子程序在同一代码段中。 (段内调用) 2、FAR属性:调用程序和子程序在不同代码段中。 (段间调用)CODE1 SEGMENT SUBR1 PROC FAR RETSUBR1 ENDP SUBR2 PROC NEAR RETSUBR2 ENDP CALL SUBR2 CALL SUBR1CODE1 ENDSCODE2 SEGMENT CALL FAR PTR SUBR1 CODE2 ENDS子程序SUBR1子程序SUBR2;段内调用;段内调用;段间调用Wu Qiulan176.3.2 现场保护和恢复现

9、场保护:在子程序功能实现前,把将要用到的寄存器的 原有内容保存起来。现场恢复:子程序功能实现后,将数据取出再送回原来的 寄存器中,保证子程序执行前后这些寄存器的 内容不被改变,从而不影响主程序对这些寄存 器的使用。注:现场保护和恢复一般通过堆栈来完成,坚持后进先出的原则。PROG PROC PUSH AX PUSH BX PUSH CX;保护现场 POPCX POPBX POPAX ;恢复现场 RET ;返回断点处PROG ENDP例:若子程序PROG中改变了寄存器AX,BX,CX的值,则可采用如下方法保护和恢复现场。Wu Qiulan196.4 子程序的设计和调用6.4.1 子程序的调用方法

10、说明1、子程序名2、子程序功能3、占用寄存器4、入口参数5、出口参数6、子程序调用示例:调用时用。:选择子程序时参考。:子程序对寄存器的使用情况。:子程序执行时应具备的条件。:子程序执行后结果存放位置。:说明调用格式。Wu Qiulan206.4.2 子程序设计例6.3 :编写子程序将两个多字节二进制数相加。说明:1、子程序名:BADD2、子程序功能:将两个多字节二进制数相加。3、寄存器占用:AL、CX、SI、DI、BX,不改变寄存器的内容。4、入口参数:SI、DI寄存器分别指向两加数首地址, BX指向和的首地址,CX中存放多字节的长度。5、出口参数:BX指向和的首地址。程序清单:BADD P

11、ROC NEAR/FAR PUSH SI PUSH DI PUSH AX PUSH BX PUSH CX ;现场保护 CLCNEXT1:MOV AL, SI ;取第一个加数中一个字节 ADC AL, DI ;和第二个加数中对应字节相加 MOV BX, AL ;存储结果 INC SI INC DI INC BX ;修改数据指针 LOOP NEXT1 ;未加完循环 ADC BYTE PTRBX, 0 POP CX POP BX POP AX POP DI POP SI ;现场恢复 RETBADD ENDPWu Qiulan236.4.3 子程序调用例6.4 :已知在BUF1、BUF2所指向的存储单

12、元中各存放4字节二进制数,编程将两个4字节二进制数相加,和存入由BUF3所指向的存储单元。DATA SEGMENT BUF1 DB 34H, 18H, 61H, 01H BUF2 DB 12H, 14H, 72H, 11H CNT EQU $-BUF2 BUF3 DB CNT+1 DUP (?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX, DATA MOV DS, AXWu Qiulan246.4.4 主程序与子程序参数传递方式入口参数:主程序传递给子程序的待处理的数据。出口参数:子程序执行完后,传递给主程序的结果。参数传

13、递方式通过寄存器传递参数通过堆栈传递参数通过存储单元传递参数Wu Qiulan25一、通过寄存器传递参数例6.5 :编写子程序实现字节数据块传送。入口参数:SI指向源块首地址,DI指向目的块首地址, CX指向数据块长度。出口参数:SI指向源块首地址,DI指向目的块首地址。DATA SEGMENT BUF1 DB 34H, 18H, 61H, 01H CNT EQU $-BUF1 BUF2 DB CNT DUP (?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX, DATA MOV DS, AX MOV SI, OFFSET

14、BUF1 ;源串首地址 MOV DI, OFFSET BUF2 ;目的串首地址 MOV CX, CNT ;长度 CALL MOVD ;调用子程序 MOV AH, 4CH INT 21H ;返回DOS设置入口参数MOVD PROC NEAR ;子程序定义开始 PUSH AX PUSH SI PUSH DI ;现场保护LOP1: MOV AL, SI ;取源串中一数据 MOV DI, AL ;存入目的串 INC SI ;修改源串指针 INC DI ;修改目的串指针 LOOP LOP1 ;没传完,继续 POP DI POP SI POP AX ;现场恢复 RET ;返回MOVD ENDP ;子程序定

15、义结束CODE ENDS END STARTWu Qiulan28二、通过堆栈传递参数例6.6 :编写子程序实现字节数据块传送。入口参数:源块首地址,目的块首地址,数据块长度,使用寄存器把三个参数压栈。DATA SEGMENT BUF1 DB 34H,18H,61H,01H CNT EQU $-BUF1 BUF2 DB CNT DUP (?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX, DATA MOV DS, AX MOV AX, OFFSET BUF1 PUSH AX ;源串首地址入栈 MOV AX, OFFSET B

16、UF2 PUSH AX ;目的串首地址入栈 MOV AX, CNT PUSH AX ;长度入栈 CALL MOVD ;调用子程序 MOV AH, 4CH INT 21H ;返回DOSMOVD PROC NEAR ;子程序定义开始 POP BX ;弹出返回地址BX POP CX ;弹出长度CX POP DI ;弹出目的串首地址DI POP SI ;弹出源串首地址SI PUSH BX ;返回地址入栈 设置入口参数 LOP1: MOV AL, SI ;取源串中一数据 MOV DI, AL ;存入目的串 INC SI ;修改源串指针 INC DI ;修改目的串指针 LOOP LOP1 ;没传完,继续

17、RET ;返回MOVD ENDP ;子程序定义结束CODE ENDS END STARTWu Qiulan31三、通过存储单元传递参数例6.7 :编写子程序实现字节数据块传送。入口参数:源块首地址,目的块首地址,数据块长度,使用存储器把三个参数传递给子程序。DATA SEGMENT BUF1 DB 34H,18H,61H,01H CNT EQU $-BUF1 BUF2 DB CNT DUP (?) BUF3 DW 3 DUP (?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX,DATA MOV DS,AXMOV BX,OFF

18、SET BUF1MOV BUF3, BX ;存源串首地址MOV BX,OFFSET BUF2MOV BUF32, BX ;存目的串首地址MOV CX, CNTMOV BUF34, CX ;存长度CALL MOVD ;调用子程序MOV AH,4CHINT 21H ;返回DOS设置入口参数 MOVD PROC NEAR ;子程序定义开始 MOV SI, BUF3 ;取源串首地址SI MOV DI, BUF3+2 ;取目的串首地址DI MOV CX, BUF3 +4 ;取长度CXLOP1: MOV AL, SI ;取源串中一数据 MOV DI, AL ;存入目的串 INC SI ;修改源串指针 INC DI ;修改目的串指针 LOOP LOP1 ;没传完,继续 RET ;返回MOVD ENDP ;子程序定义结束CODE

温馨提示

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

评论

0/150

提交评论