如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
子程序的调用子程序的结构子程序的定义3.注意问题1)过程体内必须有一条RET指令被执行proc1procmovax,0proc1endpproc2procmovbx,-1retprocendp2)调用程序和过程在同一程序段时,属性选择NEAR,当调用程序和过程不在同一程序段时,应选择FAR3)在调用时,NEAR和FAR可以强制改变CALLFARPTRNEARPROCCALLNEARPTRFARPROC子过程的调用与返回指令1.子程序的调用指令指令格式:CALLDSTDST是子程序的子程序名或子程序的首地址.可以采用与转移指令有关的四种转移的寻址方式之一,即:段内直接调用\段内间接调用\段间直接调用\段间间接调用.段内、段间:调用程序和子程序在同一段内,为段内调用;否则段间调用;直接、间接:DST为子程序名(子程序首地址),是转移地址,该有效地址直接出现在CALL指中;若有效地址出现在寄存器中间接得到,则为间接调用1)段内直接调用SP=SP-2;SS:[SP]CALL下一条指令的IPIP=IP+D16(DST为16位)2)段内间接调用SP=SP-2;SS:[SP]CALL下一条指令的IPIP=DST中的有效地址EA(DST为16位)3)段间直接调用SP=SP-2;SS:[SP]返回地址的段地址SP=SP-2;SS:[SP]返回地址的偏移值IP=DST的偏移地址CS=DST的段地址4)段间间接调用SP=SP-2;SS:[SP]返回地址的段地址SP=SP-2;SS:[SP]返回地址的偏移值IP=EA的低16位CS=EA的高16位例题:判断下列CALL指令的寻址方式:1)PRO1为过程名,属性为NEARCALLPRO12)PRO2为过程名,属性为FARCALLPRO23)设过程的偏移地址在BX中,则有指令:CALLBX4)设过程的偏移地址在[BX]中,则有指令:CALL[BX]5)设过程地址在数据段addi所指的单元中,则有指令:CALLDWORDPTRaddi6)设过程地址在[BX]中,则有指令:CALLDWORDPTR[BX]2.子程序的返回指令指令格式:RET/RETN/RETF指令功能:RET:返回地址出栈IP(段内)RETF:返回地址出栈IP(段内段间)和CS寄存器(段间)RETN:返回地址出栈IP(段内段间)和CS寄存器(段间)再将N个(必须是偶数)字节数据弹出来,保持栈的平衡。3.注意:1)CALL和RET均不影响标志2)NEAR属性的过程,RET是段内返回,汇编后仍为RET;如果是FAR属性的过程,RET是段间返回,汇编后RET为RETF.3)段内调用返回只需设置IP4)段间调用返回需设置IP和CS,多模块采用此设计方法4.子程序调用方式举例分析下面程序段,说明各种调用子程序的方法和寻址方式:datasegmentnprocdwnearpfprocddfarpdataendscode1segmentassumecs:code1,cs:dataMainprocfarmovax,datamovds,axcallnearpleaax,nearpcallaxcallnprocleabx,nproccallwordptr[bx]callfarpcallfprocleabx,fproccalldwordptr[bx]movah,4chint21hMainendp子程序的编程原则1.切分子程序根据程序的功能、结构和重复使用的程序段等特性完成子程序的切分。1)显示一个字符的子程序displayprocpushaxmovah,2int21hpopaxretdisplsyendp在主程序中调用子程序……movdl,’a’calldisplaymovdl,0dhcalldisplay…..2)通过键盘获取一个字符的子程序inputcharprocpushaxmovah,1int21hmovchar,alpopaxretintputcharendp3)显示回车换行子程序dispodoaprocpushaxpushdxmovah,2hmovdl,0dhint21hmovah,2hmovdl,0ahint21hPopdxPopaxRetDis0doaendp2.确定接口参数及参数传递方法入口参数:把子程序执行前准备的值或地址称为入口参数。是调用者提供给子程序的信息。出口参数:把子程序返回值或地址称为出口参数。是子程序运行后,返回调用者的信息。保存入口参数和出口参数的方法:利用堆栈或寄存器3