第六章 子程序的设计 汇编语言程序的设计课件.pptVIP

第六章 子程序的设计 汇编语言程序的设计课件.ppt

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章 子程序的设计 汇编语言程序的设计课件.ppt

*; 为了程序共享或模块化设计的需要,可以把一段公共语句序列设计成子程序或宏指令的形式。本章介绍子程序的设计方法。;6.1 子程序结构及设计方法; 其中过程名就是子程序名,它也表示子程序入口的符号地址。 属型可以是NEAR型(缺省值)或FAR型。NEAR型子程序只可以被段内调用,而FAR型子程序可以被段间或段内调用。;1.调用程序和子程序在同一个代码段的程序结构 CODE SEGMENT MAIN PROC FAR … CALL SUB1 RET MAIN ENDP SUB1 PROC ;类型可缺省 … RET SUB1 ENDP CODE ENDS ;END后跟主程序名 END MAIN;2.寄存器的保存与恢复 为了保证调用程序的寄存器内容不被破坏,应在子程序开头保存它要用到的寄存器内容,返回前再恢复它们。;3.注意堆栈状态 在设计含有子程序的程序时,要密切注意堆栈的变化。这包括要注意一切与堆栈有关的操作。例如CALL调用类型和子程序定义类型的一致性,PUSH和POP指令的匹配,通过堆栈传递参数时子程序返回使用RET n指令等,以确保堆栈平衡。;北京理工大学-张华平-2011;北京理工大学-张华平-2011;北京理工大学-张华平-2011;北京理工大学-张华平-2011;6.3 子程序参数传递;北京理工大学-张华平-2011;*;1.通过寄存器传递 这种传递方式使用方便,适用于参数较少的情况。 例.把BX中的16位二进制数转换成十进制并显示在屏幕上。 分析:采用从高到低逐个除以十进制位权的方法。(见程序6.3);2.若调用程序和子程序在同模块中,子程序可以直接访问模块中的变量 例.实现数组求和功能。要求数组求和(不考虑溢出情况)由子程序实现,其数组元素及结果均为字型数据。见程序6.4。;3.通过地址表传递参数地址 适用于参数较多的情况。具体方法是先建立一个地址表,该表由参数地址构成。然后把表的首地址通过寄存器或堆栈传递给子程序。 例.编写一个数组求和子程序,其数组元素及结果均为字型数据。另定义两个数组,并编写一个主程序,通过调用数组求和子程序分别求出两个数组的和。; 分析:虽然主、子程序在同模块中,但由于在一个程序中要分别求出两个数组的和,因此子程序不能直接引用数组变量名。 本例用数组首地址、元素个数的地址、和地址构成地址表,通过地址表传送这些参数的地址,以便子程序能够访问到所需参数。 见程序6.5。;4.通过堆栈传递参数或参数地址 这种方式适用于参数较多,或子程序有多层嵌套、递归调用的情况。 步骤: 主程序把参数或参数地址压入堆栈; 子程序使用堆栈中的参数或通过栈中参数地址取到参数; 子程序返回时使用RET n指令调整SP指针,以便删除堆栈中已用过的参数,保持堆栈平衡,保证程序的正确返回。;例.完成数组求和功能,求和由子程序实现,要求通过堆栈传递参数地址。 (见程序6.6) ; 本例通过BP访问堆栈中的参数。 程序的堆栈变化情况参见图6-1,指示了程序中所有入栈操作对堆栈的影响随入栈数据的增加,SP的值不断减小,堆栈可用空间也随之减少。图6-2为已从子程序返回、而主程序RET指令执行前的堆栈状态,其中的灰色部分表示执行语句⑿~⒄时已弹出的数据。; 随着弹出数据的增加,SP的值不断增大,堆栈可用空间也随之增大。子程序中语句⒄——RET 6指令,在从堆栈弹出返回地址后还要使SP值加6,这样就跳过了通过堆栈传递的三个参数,或者说删除了它们。 因此,当主程序的语句⒅——RET指令被执行时,程序控制从栈顶弹出数字0给IP,弹出PSP的段基址给CS,于是执行PSP:0处的INT 20H指令,正确返回操作系统。;返回;返回; 从以上分析可以看出,通过堆栈传递参数时子程序的返回指令必须是RET N形式,当堆栈操作是16位时N值应该是压入堆栈的参数个数的2倍,只有这样保证程序的正常运行。 用结构形式访问堆栈中的参数,这种方法更简便及规范化。; 例.完成数组求和功能,其中求和由子程序实现,要求使用结构访问堆栈中的参数。 图6-3给出了堆栈及结构数据定义。注意这些结构字段的顺序为其值压入的逆序。实际上,它只是给图6-1中由主程序压入的数据、返回地址及子程序压入的BP值起了个名字而已,而字段值的预置是通过PUSH和CALL指令实现的。当子程序用到堆栈中的参数时,只需使用BP作为基地址、通过结构字段名访问就可以了。编码见程序6.7。;返回;6.4 嵌套与递归子程序;主程序; 由于子程序嵌套对堆栈

您可能关注的文档

文档评论(0)

yuzongxu123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档