欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【教学课件】第六章子程序设计.ppt

    • 资源ID:5663552       资源大小:423.47KB        全文页数:69页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【教学课件】第六章子程序设计.ppt

    第六章 子程序设计,一、子程序的定义二、子程序的结构形式三、子程序的设计和调用四、子程序的参数传递方法五、子程序的嵌套和递归调用六、子程序的设计举例七、多模块程序设计八、汇编语言和高级语言的混合编程,一、子程序的定义,1、子程序的概念和特点2、子程序的定义3、子程序的调用和返回,1、子程序的概念和特点,子程序:把在程序中多次出现,具有独立功能的程序段写成程序模块,该模块可被多次调用,称之为子程序。,特点:可重复使用(调用)具有通用性(可通过入口参数实现)可浮动性(存放位置灵活)可递归性和可重入性,子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名 PROC NEAR/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 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 SEGMENTASSUME 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指令的后续指令继续执行。,二、子程序的结构形式,子程序设计考虑四部分:保护现场(保存寄存器原有的内容)、处理部分、恢复现场(恢复寄存器原有的内容)、子程序的返回。,“现场”:子程序执行中要用到的寄存器。保护现场:一般通过压栈实现(进入子程序前)恢复现场:一般通过出栈实现(返回子程序前),1、子程序的调用方法说明,(1)子程序名:供调用时使用(2)入口参数:子程序执行需要的数据(3)出口参数(输出参数):说明子程序执行后结果存放在何处。(4)占用寄存器:说明子程序执行时需要使用那些寄存器。那些改变,那些不变。,注意:作为存放出口参数用的寄存器不能保护。,2信息的保护与恢复,例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROGPROCPUSHAX PUSHBX PUSHCX;保护现场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 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为首地址的缓冲区的一个字符串中的所有大写字母都转换成小写字母,并在屏幕显示出来。,程序清单如下:DATASEGMENTORG200HSTRINGDB 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 SI 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数据块传送子程序,分析:入口参数:源操作块首地址、目的块首地址和块长度。分别用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,SI 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用堆栈传递参数,实现数据块传送。,入口参数:源数据块首地址,目的数据块首地址及数据块长度。均用寄存器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,4CHINT 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,13HSUMA 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 PROC 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,13H,2FH,1AH,94HLENS EQU$-SOUCE BLOCK2 DB LENS DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX,XOR SI,SI XOR DI,DI MOV CX,LENS CALL MOVSTOK MOV AH,4CH INT 21HMOVSTOK PROC NEAR PUSH AXNEXT:MOV AL,BLOCK1SI MOV BLOCK2DI,AL INC SI,INC DI LOOP NEXT POP AX RETMOVSTOK ENDPCODE ENDSEND START,五、子程序的嵌套和递归调用,嵌套:子程序中再调用其它子程序递归:子程序体中调用它本身,一般用于数学上函数的递归定义。,1、子程序的嵌套调用,嵌套与递归的共同之处就是都要用到堆栈操作,用于保护断点。,主程序:,CALL SUB1(断点1:)HLT,SUB1:CALL SUB2(断点2:)RET,SUB2:RET,子程序:,子程序:,子程序的嵌套调用,例:找出BUF区存放的若干字节的最小值。并以十六进制形式显示。,程序利用嵌套实现DISP 显示一位十六进制数,被显示的内容存放在DL低4位。SEARCH 在BUF区中搜索最小无符号数入口参数:SI 被搜索数据区的首地址。CX 存放数据的个数。出口参数:DL中存放最小值,CALL SEARCH SEARCH PROC CALL DISP CALL DISP RETSEARCH ENDP,DISP PROCCMP DL,9JBE DISP1ADD DL,7DISP1:ADD DL,30HMOV AH,2INT 21HRETDISPENDPCODE ENDSEND START,子程序的递归调用,例6-10:求N的阶乘算法:=1(N=1)N!=N*(N-1)!(N1),入口参数:N的值,利用寄存器AX出口参数:阶乘值,用寄存器DX,DATA SEGMENTN DW 6RESU DW?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AX,NCALL FACTMOV RESU,DX,MOV AH,4CHINT 21HFACT PROC CMP AX,0JNE NEXTMOV DX,1JMP EXITNEXT:PUSH AXDEC AXCALL FACTPOP AX,MUL DLMOV DX,AXEXIT:RETFACT ENDPCODE ENDSEND START,六、子程序设计举例,汇编语言在源程序的编写时,常用到输入和输出,当丛键盘输入一个数据时,输入设备实际是将数据(二进制、十六进制或十进制)的ASCII码输入计算机。而在输出时,不管是2、16或10进制的输出,都需要将计算机内部的二进制转换成相应进制的各位的ASCII码。,标准输出STDOUT PROCPUSH DXMOV DL,ALMOV AH,2INT 21HPOP DXRETSTDOUT ENDP入口参数:输出字符ASCII码送AL,输入输出子程序标准输入STDIN PROCMOV AH,1INT 21HRETSTDIN ENDP入口参数:等待输入字符出口参数:输入字符的ASCII码存入AL寄存器,例1:将ASCII 码表示的16进制数,转换成1个字的二进制数。入口参数:从输入设备输入的一个十六进制数。出口参数:一个字的二进制数,在DX寄存器中。,HEX16IN PROCPUSH CXPUSH AXMOV DX,0HEX1:CALL STDINSUB AL,30HJL HEX3CMP AL,9JLE HEX2SUB AL,7CMP AL,0AH,JL HEX3CMP AL,0FHJG HEX3HEX2:CBWMOV CL,4SAL DX,CLADD DX,AXJMP HEX1HEX3:POP AXPOP CX RET,例2 将二进制数转换成16进制数的ASCII码输出。入口参数:16位二进制数存放在BX中出口参数:以十六进制输出这个二进制数。,HEX16OUT PROCPUSH CXPUSH AXMOV CX,4HEX1:PUSH CXMOV CL,4ROL BX,CLMOV AL,BLAND AL,0FHCMP AL,0AH,JB HEX2ADD AL,7HEX2:ADD AL,30HCALL STDOUTPOP CXLOOP HEX1POP AXPOP CXRETHEX16OUT ENDP,七、多模块程序设计,多模块程序结果是一种在设计大、中程序时选用的程序结构格式。在程序设计中可以根据需要,将程序划分成多个模块(MODULE)。每个模块都是一个可独立汇编的源程序文件。源程序各模块编写好后,首先分别生成相应的.OBJ文件,再将这些目标文件进行连接,生成一个可执行文件。,PUBLIC伪指令格式:PUBLIC 符号,符号功能:说明其后的符号是全局符号。全局符号能被其他模块引用。EXTRN伪指令格式:EXTRN 符号:类型,符号:类型功能:说明在本模块中需要引用的、由其他模块定义的符号,即外部符号。,1、多模块程序设计中,全局符号与外部符号的说明。,2、多模块程序文件的连接操作若一个程序的多个模块,则每个模块都是一个独立的.ASM文件,通过汇编得到几个相应的目标文件(.OBJ)文件后,再用连接程序将这几个目标文件连接成一个可执行文件(.EXE)。连接时用“+”来连接各个目标文件。,例:多模块程序设计。(GETIN.ASM和GETOUT.ASM)其中模块GETIN.ASM是从键盘输入一个字符串至BUF缓冲区,调用GETOUT.ASM子模块,GETOUT.ASM子模块用于显示BUFF的内容。,注意,多模块程序设计中,只有主模块中需要返回DOS语句,子模块不需要。,public buff extrn disp:far extrn cr:fardata segmentBuf db 10,?,10 dup(?),$data endscode segment assume cs:code,ds:data start:mov ax,data mov ds,ax lea dx,buff,mov ah,10int 21h call far ptr cr call far ptr disp mov ah,4chint 21hcode endsend start,模块GETIN.ASM,模块GETOUT.ASM,extrn buff:byte public disp public crcode segment assume cs:codedisp proc far mov ax,seg buff mov es,ax lea dx,es:buff+2 mov ah,9 int 21h,retdisp endpcr proc farmov dl,13hmov ah,2int 21hmov dl,10hmov ah,2int 21h retcr endpcode endsend,八、汇编语言和高级语言的混合编程,调用协议TC与汇编的模块连接法嵌入式汇编,1、TC调用汇编语言TC与汇编模块连接的约定规则如下:(1)存储器使用约定:TC应与汇编语言采用相同的存储模式,以便编译产生正确的可执行文件。(2)汇编语言中被TC语言所引用的子程序或变量名前面需加上下划线“_”(3)TC对所调用的汇编语言的子程序、变量等采用EXTERN说明;在汇编语言中需将被调用的子程序或变量用PUBLIC操作符定义。,调用协议,(4)汇编语言与高级语言程序间的参数传递,一般采用堆栈来传递,即调用程序将参数依次压入堆栈中,被调程序再从堆栈中依次弹出参数作为操作数使用。(5)汇编子程序在执行完,返回值是按如下规则保存的:如果返回值为字节数据,送AL寄存器;如果返回值为字数据,送AX寄存器;如果返回值为双字数据,送DX:AX寄存器(其中DX为高字单元)。(6)汇编程序和TC程序各自独立汇编成OBJ文件,在TC下,将两个OBJ文件连接成EXE可执行文件。,2、汇编语言调用TC(1)首先应在TC程序中说明汇编语言所引用的变量或程序是全局的。(2)在汇编语言中用EXTRN伪指令声明所引用的TC子函数和变量。(3)按照C语言的调用协议将参数压栈。(4)汇编语言的调用用CALL指令。(5)返回值从AL、AX或DX:AX中获得。(6)TC程序和汇编程序各自独立编译生成OBJ文件。在汇编语言下用TASM/MASM生成可执行EXE文件。,TC与汇编的模块连接法,例6.13 使用C语言调用汇编子程序,实现字符串显示。,;汇编语言子程序 hello.asm.model small;采用小型存储模式.data mesg db Hello,world!$.code public _display _display proc;过程名加上下划线 mov ah,9;小型模式不必设置DS mov dx,offset mesg,int 21h ret_display endp end,/*C语言程序display.c*/extern void display(void);/*说明display是外部函数*/main()display();编译连接时在DOS提示符下输入如下命令:tasm hello.asm;汇编hello.asm生成目标文件hello.objtcc-ms c display.c;按小模式编译display.c为display.objtlink libc0s display hello,display,libcs;连接目标文件为display.exe,嵌入式汇编,嵌入式汇编也称行内汇编,指的是在C语言中直接使用汇编语言语句,它的特点是简洁直观。,嵌入汇编语言的语法如下:asm 注意:这里的分号;不是汇编语言中起注释作用的分号,而是作为语句的分隔符。若要嵌入一组汇编语句,则需要用括号“”,例6.16 在C语言源程序中嵌入汇编语言语句实现赋值语句A=A+B+C,其中:A、B、C都是整型变量。,/*程序名为ltadd.c*/includeint add(int A,int B,int C)asm push ax/*实现整型变量A=A+B+C*/asm movax,A asm addax,B asm addax,C asm movA,ax asm popax,main()int A,B,C;A=4;B=11;C=5;print(The result is%d,add(A,B,C);,汇编时键入Tcc-b ms c ltadd在连接时键入Tlink libc0s ltadd,ltadd,libcs从而得到ltadd.exe文件,See you next time.,

    注意事项

    本文(【教学课件】第六章子程序设计.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开