- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章 子程序结构 二、调用程序和子程序之间的参数传递方式 主程序在调用子程序时,通常需要向其提供一些数据,对于子程序来说就是人口参数(输入参数);同样,子程序执行结束也要返回给主程序必要的数据,这就是子程序的出口参数(输出参数)。主程序与子程序间通过参数传递建立联系,相互配合共同完成处理工作。 传递参数的多少反映程序模块间的耦合程度。根据实际情况,子程序可以只有人口参数或只有出口参数,也可以入口和出口参数都有。汇编语言中参数传递可通过寄存器、变量或堆栈来实现,参数的具体内容可以是数据本身(传数值)也可以是数据的存储地址(传地址)。 由于子程序相对独立、需要传递参数、具有多种参数传递方法,所以过程定义时,加上适当的注释是有必要的。完整的注释应该包括子程序的功能、人口参数和出口参数等。 1.通过寄存器传递参数 简单方便,但REG数量有限,要求传递参数多时不宜采用。需预先约定传递参数的通用REG,调用程序将要传递的参数送到约定REG中。 例2a:设array是10个元素的数组,每个元素是8位数据。试用子程序计算数组元素的校验和,并将结果存人变量result中。所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。 data segment count equ 10 ;数组元素个数 array db 12h,25h,ofoh,oa3h,3,68h,71h,ocah,oflh,90h ;数组 result db ? ;校验和 data ends coseg segment assume ds:data,cs:coseg main proc far start: mov ax,data mov ds,ax mov bx,offset array ;bx←数组的偏移地址 mov cx,count ;CX←数组的元素个数 call checksuma ;调用求和过程 mov result,al ;处理出口参数 main endp ;计算字节校验和的通用过程 ;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数 ;出口参数:AL=校验和 ;说明:除AX/BX/CX外,不影响其他寄存器 checksuma proc xor al,al ;累加器清0 suma: add al,[bx] ;求和 inc bx ;指向下一个字节 loop suma ret checkstuna endp coseg ends end start 分析: 子程序完成元素求和,主程序需要向它提供入口参数,使得子程序能够访问数组元素。子程序需要回送求和结果这个出口参数。本例采用寄存器传递参数。 由于数组元素较多,直接用寄存器传送元素有困难;但是,元素在主存中是顺序存放的;所以,我们选用寄存器DS和BX传人数组首地址,用计数器CX传人数组元素个数。一个输出参数可以就用累加器AL传出。这样,主程序设置好人口参数后调用子程序checksuma,最后将结果送入指定单元。子程序首先保护寄存器,然后通过入口参数完成简单的循环累加,并在AL中得到校验和作为出口参数。 2.用变量传递参数 主程序与被调用过程直接用同一个变量名访问传递的参数,就是利用变量传递参数。如果调用程序与被调用程序在同一个源程序文件中,只要设置好数据段寄存器DS,则子程序与主程序访问变量的形式相同,也就是它们共享数据段的变量。调用程序与被调用程序不在同一个源文件中,必须利用public/extern进行声明,才能用变量传递参数。 例2b: 对例2a问题,现在用变量传递参数、计算数组元素的校验和。 data segment count equ 10 ;数组元素个数 array db 12h,25h,ofoh,oa3h,3,68h,71h,ocah,oflh,90h ;数组 result db ? ;校验和 data ends coseg segment assume ds:data,cs:coseg main proc far start: call checksumb ;调用求和过程 ?main endp ;计算字节校验和 ;入口参数:array=数组名,count=元素个数,result:校验和存放的变量名 checksumb proc push ax push bx push cx xor a1,al ;累加器清O mov bx,offset array ;BX←数组的偏移地址 mov cx,count ;CX
文档评论(0)