- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章子程序结构-1,西门子程序结构,钩子程序,子程序,子程序调用,按键精灵子程序,子程序循环软中断,子程序或函数未定义,易语言调用子程序,易语言子程序指针
第六章 子程序结构 6.1 子程序的设计方法 6.2 子程序的嵌套 6.3 子程序举例 6.4 DOS系统功能调用 6.1 子程序的设计方法 6.1.1 过程定义伪操作 6.1.2 子程序的调用和返回 6.1.3 保护与恢复寄存器 6.1.4 子程序的参数传送 6.1.5 增强功能的过程定义伪操作 6.1.1 过程定义伪操作 过程名 PROC NEAR (FAR) 过程名 ENDP (1) NEAR属性:调用程序和过程在同一个 代码段中 (段内调用) (2) FAR属性:调用程序和过程不在同一个 代码段中 (段间调用) 6.1.2 子程序的调用和返回 子程序调用:隐含使用堆栈保存返回地址 call near ptr subp (1) 保存返回地址 (2) 转子程序 call far ptr subp (1) 保存返回地址 (2) 转子程序 子程序返回:ret 6.1.3 保护与恢复寄存器 SUBT PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX …… …… POP DX POP CX;若CX和DX位置互换,意义如何? POP BX;原则上除了实现过程通信的 POP AX;量以外都要进行现场保护 RET SUBT ENDP 【例】延时程序,在实际应用中一般作为子程序调用,现在我们把延时1s的程序设计成子程序。 程序内容如下:(省略段的定义) DELAY1S: PUSHF ;现场保护 PUSH BX PUSH CX MOV BX,3E8H;1000D LP2: MOV CX,176H LP1: PUSHF POPF LOOP LP1;延时1ms DEC BX JNZ LP2;延时1s POP CX POP BX POPF RET 从上面的子程序我们可以看出:子程序中因为用到了BX,CX和标志寄存器,所以程序一开始就用了3条PUSH指令,把这些寄存器内容压进堆栈,以保护CPU的现场;而在返回前,它又用了3条POP指令(遵循“先入后出”的原则)把栈中内容弹回到寄存器中去。当然,这些保护现场和恢复现场的工作在主程序不怕丢失这些内容时,可以不用,或者放在主程序中解决,但一般来说,放在子程序中更妥当,也更通用些。 在编写实际子程序时要注意下列问题: (1) 入口信息 。 (2) 出口信息。 (3) 现场的保护和恢复。先仔细观察子程序中到底用了哪些寄存器,以便主程序调用它时注意保护和恢复现场。 (4) 最后一条一定是RET指令。 在这一节里,我们只举了例1一个简单的子程序,但在实际应用中,我们可以把各种功能的程序编成子程序。 例如,一个任意数的平方;把一组数进行排序;多倍精度的二—十进制数相加;十进制数与二进制数的转换等等,都可以编成子程序来调用。这种工作不仅对学习子程序来说是必要的,而且,对于熟练编程,积少成多也是必不可少的。 另外,值得提出的是:子程序方式也可以利用到编写大型复杂的程序中去。也就是说,我们可以把一个复杂的程序分割成很多独立的,关联较少的模块,分别编写成子程序,然后,用一个主程序(主要由调用子程序指令构成)把它们串联起来。这样的程序不但结构清晰,而且对调试也带来极大的方便。这一点,在具体实践中会有更深刻的体会。 6.1.4 子程序的参数传送 1. 通过寄存器传递参数 2. 通过存储器传递参数 (过程和调用程序在同一源程序文件中,则过程可直接访问模块中的变量) 3. 通过地址表传送参数地址
文档评论(0)