第6章子程序结构(2)_第1页
第6章子程序结构(2)_第2页
第6章子程序结构(2)_第3页
第6章子程序结构(2)_第4页
第6章子程序结构(2)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章第六章 子程序结构子程序结构 二、调用程序和子程序之间的参数传递方式二、调用程序和子程序之间的参数传递方式 主程序在调用子程序时,通常需要向其提供一些数据,对于子程序来说就是人口参数(输入参数);同样,子程序执行结束也要返回给主程序必要的数据,这就是子程序的出口参数(输出参数)。主程序与子程序间通过参数传递建立联系,相互配合共同完成处理工作。 传递参数的多少反映程序模块间的耦合程度。根据实际情况,子程序可以只有人口参数或只有出口参数,也可以入口和出口参数都有。汇编语言中参数传递可通过寄存器、变量或堆栈来实现,参数的具体内容可以是数据本身(传数值)也可以是数据的存储地址(传地址)。 由于子

2、程序相对独立、需要传递参数、具有多种参数传递方法,所以过程定义时,加上适当的注释是有必要的。完整的注释应该包括子程序的功能、人口参数和出口参数等。1.通过寄存器传递参数简单方便,但REG数量有限,要求传递参数多时不宜采用。需预先约定传递参数的通用REG,调用程序将要传递的参数送到约定REG中。 例2a:设array是10个元素的数组,每个元素是8位数据。试用子程序计算数组元素的校验和,并将结果存人变量result中。所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。 datasegmentcountequ 10;数组元素个数arraydb 12h,25h,ofoh,oa3h,3,68h

3、,71h,ocah,oflh,90h ;数组resultdb ?;校验和dataendscosegsegmentassume ds:data,cs:cosegmain proc farstart:mov ax,datamov ds,axmov bxmov bx,offset arrayoffset array ;bx数组的偏移地址mov cxmov cx,countcount ;CX数组的元素个数call checksumacall checksuma ;调用求和过程mov resultmov result,alal ;处理出口参数main endpmain endp;计算字节校验和的通用过程

4、;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数;出口参数:AL=校验和;说明:除AXBXCX外,不影响其他寄存器checksuma procxor al,al ;累加器清0suma:add al,bx ;求和inc bx ;指向下一个字节loop sumaretcheckstuna endpcoseg ends end start分析: 子程序完成元素求和,主程序需要向它提供入口参数,使得子程序能够访问数组元素。子程序需要回送求和结果这个出口参数。本例采用寄存器传递参数。 由于数组元素较多,直接用寄存器传送元素有困难;但是,元素在主存中是顺序存放的;所以,我们选用寄存器DS和B

5、X传人数组首地址,用计数器CX传人数组元素个数。一个输出参数可以就用累加器AL传出。这样,主程序设置好人口参数后调用子程序checksuma,最后将结果送入指定单元。子程序首先保护寄存器,然后通过入口参数完成简单的循环累加,并在AL中得到校验和作为出口参数。2用变量传递参数 主程序与被调用过程直接用同一个变量名访问传递的参数,就是利用变量传递参数。如果调用程序与被调用程序在同一个源程序文件中,只要设置好数据段寄存器DS,则子程序与主程序访问变量的形式相同,也就是它们共享数据段的变量。调用程序与被调用程序不在同一个源文件中,必须利用publicextern进行声明,才能用变量传递参数。例2b:对

6、例2a问题,现在用变量传递参数、计算数组元素的校验和。datasegmentcount equ 10;数组元素个数arraydb 12h,25h,ofoh,oa3h,3,68h,71h,ocah,oflh,90h ;数组result db ?;校验和dataendscoseg segmentassume ds:data,cs:coseg main proc far start:call checksumb ;调用求和过程 main endp;计算字节校验和;入口参数:array=数组名,count=元素个数,result:校验和存放的变量名checksumb procpush axpush b

7、xpush cxxor a1,al ;累加器清Omov bx,offset array ;BX数组的偏移地址mov cx,count ;CX数组的元素个数sumb:add al,bx ;求和inc bxloop sumbmov result,al ;保存校验和pop cxpop bxpop axretchecksumb endpcoseg endsend start 分析:采用变量传递参数,本例是共用count、array和result变量。主程序只要设置数据段 DS,就可以调用子程序;子程序直接采用变量名存取数组元素。 利用变量传递参数,过程的通用性较差。显然,例题2b不如例题1。通用,也不

8、如例题2a来得自然。然而,在多个程序段间、尤其在不同的程序模块问,利用全局变量共享数据也是一种常见的参数传递方法。3通过堆栈传递参数或参数地址 上面,用共享寄存器和变量(存储单元)的方法实现了参数传递;同样,也可以通过共享堆栈区,即利用堆栈传递参数。主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们。例2c:对例2a问题,现在用堆栈传递参数、计算数组元素的校验和。分析:通过堆栈传递参数,主程序将数组的偏移地址和元素个数压入堆栈,然后调用子程序;子程序通过BP寄存器从堆栈相应位置取出参数(非栈顶数据),求和后用AL返回结果。由于共用数据段,

9、所以没有传递数据段基地址。本例利用堆栈传递人口参数,但出口参数仍利用寄存器传递。datasegmentcount equ 10;数组元素个数arraydb 12h,25h,ofoh,oa3h,3,68h,71h,ocah,oflh,90h ;数组result db ?;校验和dataendscoseg segmentassume ds:data,cs:cosegcoseg segment main proc far start:mov ax,offset army ;设置人口参数push ax ;压人数组的偏移地址mov ax,countpush ax ;压人数组的元素个数call check

10、sumc ;调用求和过程add sp,4 ;主程序平衡堆栈mov result,al ;保存校验和main endp;计算字节校验和的近过程;入口参数:在堆栈压人数组的偏移地址和元素个数;出口参数:al=校验和checksumc procpush bpmov bp,sp ;BP指向当前栈顶,用于取出人口参数push bx ;保护使用的bx和cx寄存器push cxmov bx,bp+6 ;BXSS:BP+6(数组的偏移地址)mov cx,bp+4 ;CXSS:BP+4(数组的元素个数)xor al,al ;累加器清0sumc add al,bx ;求和:ALAL+DS:Bxinc bxloop

11、 sumcpop cX ;恢复寄存器pop bxpop bpretcheeksume endpcoseg ends end start上述程序执行过程中利用堆栈传递参数的情况如图所示。进入子程序后,设置基址指针BP等于当前堆栈指针SP,这样利用BP相对寻址(缺省采用堆栈段SS)可以存取堆栈段中的数据。主程序压人了2个参数,使用了堆栈区的4个字节;为了保持堆栈的平衡,主程序在调用CALL指令后用一条add sp,4”指令平衡堆栈。平衡堆栈也可以利用子程序实现,则返回指令采用ret 4”,使sp加4。 由此可见,由于堆栈采用“先进后出”原则存取,而且返回地址和保护的寄存器等也要存于堆栈;因此,用堆栈传递参数时,要时刻注意堆栈的分配情况,保证参数的正确存取以及子程序的正确返回。(例:P206) 4.通过地址表传递参数地址在主程序中建立一个地址表,把要传递给子程序的参数都存放在地址表中,然后把地址表的首地址通过寄存器BX传送到子程序中。(例:P204 6.4) 5.多个模块之间参数的传递调用次序和子程序不在同一程序模块中参数的传递方法:(1)外部符号:在一个模块中定义,在另一个模块中使用

温馨提示

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

评论

0/150

提交评论