资源描述:
《第5章模块化程序设计课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第5章模块化程序设计5.1子程序结构5.2参数传递5.3多模块程序结构5.4宏结构第5章模块化程序设计问题的引入子程序、文件包含、宏汇编等各种多模块编程的方法例1:利用C语言编写计算c=a+b#include"stdafx.h"#include"stdio.h"intmain(intargc,char*argv[]){inta,b,c;a=1;b=2;c=a+b;printf(“c=%d",c);return0;}#include"stdafx.h"#include"stdio.h"intmain(intargc,char*argv[]){inta,b,c;a=1;b=2;c
2、=a+b;printf(“c=%d",c);return0;}3datasegmentadb?bdb?cdb?stringdb'c=$'dataendscodesegmentmainprocfarassumecs:code,ds:data,es:datastart:pushdssubax,axpushaxmovax,datamovds,axmoves,axmova,1movb,2moval,aaddal,bmovc,alleadx,stringmovah,09int21haddc,30hmovdl,cmovah,2int21hmovdl,0ahint21hmovdl,0dhi
3、nt21hretmainendpcodeendsendstart例2:用汇编编写:45.1子程序结构经常用到的应用问题编写成一个通用子程序大型处理过程分解成能够解决的模块使用子程序可以使程序的结构更为清楚程序的维护更为方便有利于大程序开发时的多个程序员分工合作子程序(Subroutine)=函数(Function)=过程(Procedure)55.1.1子程序指令子程序与主程序分开、完成特定功能的一段程序主程序(调用程序)执行调用指令CALL调用子程序子程序(被调用程序)执行返回指令RET返回主程序CALLlabel主程序RET子程序回到CALL指令后的指令处-断点61.子程序调
4、用指令CALLCALL指令用在主程序中,实现子程序的调用分成段内调用(近调用)和段间调用(远调用)目标地址采用相对寻址、直接寻址或间接寻址入栈返回地址:将CALL下条指令的地址压入堆栈CALLlabel;调用标号指定的子程序CALLreg32/reg16;调用寄存器指定地址的子程序CALLmem48/mem32/mem16;调用存储单元指定地址的子程序CALLCSEIPStackCALL72.子程序返回指令RETRET指令用在子程序结束,实现返回主程序RET;无参数返回:出栈返回地址RETi16;有参数返回:出栈返回地址;ESP←ESP+i16MASM会根据存储模型等信息确定子程
5、序的远近调用,并相应产生返回指令RETCSEIPStackCALLRET83.过程定义伪指令MASM利用过程定义伪指令获得子程序信息过程名PROC……;过程体过程名ENDP;过程名为符合语法的标识符PROC后面可加参数:NEAR或FAR简化段定义源程序格式中,通常不需指定9〔例5-1〕子程序调用程序-1;代码段,主程序00000000B800000001moveax,100000005BD00000005movebp,50000000AE800000016callsubp;子程序调用0000000FB900000003retp1:movecx,300000014BA0000000
6、4retp2:movedx,400000019E800000000Ecalldisprd;代码段,子程序0000002500000025subpprocoffsetretp1StackCALL10〔例5-1〕子程序调用程序-2;代码段,子程序subpproc;过程定义,过程名为subppushebpmovebp,espmovesi,[ebp+4];ESI=CALL下条指令(标号RETP1)偏移地址movedi,offsetretp2;EDI=标号RETP2的偏移地址movebx,2popebp;弹出堆栈,保持堆栈平衡ret;子程序返回subpendp;过程结束MOV[EBP+4]
7、,EDI示意图11子程序调用的堆栈retp1EBPStackCALLSUBPRETPUSHEBP低地址高地址POPEBPESP=EBP125.1.2子程序设计子程序的编写方法与主程序一样但需要留意几个问题:利用过程定义,获得子程序名和调用属性RET指令返回主程序,CALL指令调用子程序压入和弹出操作要成对使用,保持堆栈平衡开始保护寄存器,返回前相应恢复安排在代码段的主程序之外子程序允许嵌套和递归最好有完整的注释难点是参数传递13〔例5-2〕回车换行子程序dpcrlfproc;回车