- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第07章 子程序设计和系统功能调用
制作子程序的两个主要原因:
① 替代具有相同功能的代码段,以节省代码空间和编程及软件维护的代价;
② 程序功能模块以子程序的形式实现,主程序和功能模块间的衔接规范严谨,程序结构简洁、清晰,易于编程和维护。;主程序;7.1.1 子程序定义伪指令
子程序名 proc 属性
……
ret
子程序名 endp
① 子程序命名;
② 属性:near/far;
③ ret必须是子程序最后执行的代码。;7.1.2 带段内调用子程序的程序框架; 在作需要用到子程序的练习和编写代码量不大的应用程序时,可以使用这种框架。如果代码量较大,可采用教材有多个逻辑段的框架。
由于带子程序的单段结构已经能满足相当规模应用的需要,所以带子程序的单段结构是我们学习的重点。;7.1.3 子程序的调用和返回
① 子程序的调用
CALL 子程序名
子程序名是子程序入口的符号地址。和JMP指令类似,子程序的调用分段内和段间、直接和间接四种形式。 CALL指令相当于:
“PUSH IP/CS:IP”
JMP 子程序名; ①段内直接调用
CALL PROC_NAME
②段内间接调用
CALL BX
③段间直接调用
CALL FAR PTR PROC_NAME
④段间间接调用
CALL DWORD PTR [BX]
和段间间接无条件转移一样,32位地址指针只能预置在四个存储器单元里。;XXXX;XXXX;② 子程序的返回
RET n ; 参数 n 结合例子介绍
RET不带 n 时执行的动作等效于:
“POP IP”
“POP CS” ;段间返回需要
当 RET 所在过程是 NEAR 型时只将栈顶的内容送 IP; 若所在过程是 FAR 型的,还需将 (SP+2)的内容送入 CS。;段内返回指令执行前后堆栈的情况;段间返回指令执行前后堆栈的情况;7.2 子程序设计;④ 维持堆栈平衡
如果入出子程序时 PUSH 和 POP 的次数不一致,就会导致 RET 弹出到 IP(段间返回还包括 CS)的内容不是子程序的返回地址,程序几乎是必死无疑。
⑤ 撰写子程序使用文档
子程序名/功能/入出参数/使用寄存器/是否调用其他子程序/调用形式及举例 ;7.2.2 通过堆栈传递参数
通过堆栈传递参数需要注意:堆栈是一个结构特殊、公用的数据区域,通过堆栈传递传递参数,势必造成和其他数据混用的情形,这和在机场传送带上取行李有些类似。
调用前将参数压栈 ;? 子程序调用前后堆栈的变化;从堆栈读取参数
即首先确定最后入栈参数的位置,其他参数根据和它的顺序关系即可方便获取。;7.2.3 子程序设计举例
例7.2.1
例7.2.2 ; DOS 的功能调用为程序开发提供了涉及系统和接口的常用功能,使用这些功能调用,可以简化编程。
这里只介绍的几个和我们学习汇编语言编程相关的几个常用的功能调用。
DOS 功能调用的一般格式:
MOV AH,功能号
INT 21H;① 单字符输入(输入字符存放在AL中)
MOV AH,1
INT 21H
② 单字符输显示
MOV DL,待显示字符的ASC码
MOV AH,2
INT 21H;③ 字符串输入(0AH)
MOV DX,OFFSET BUFFER
MOV AH,0AH
INT 21H
因输入字符串的长度应该是任意的,输入串不可能存放在空间很有限的寄存器里,所以在使用本功能前需要准备输入串的存储空间。这块存储区用DX指向,且前两个字节用于存放编程者指定的最大串长和功能调用后实际输入的串长(缓存结构见下面举例)。;④ 字符串显示(09)
MOV DX,OFFSET BUFFER
MOV AH,9
INT 21H
该功能调用显示DX指向的以$结尾的字符串。;系统功能调用举例
例7.3.1
例7.3.2;本章小结:
功能及层次规划合理的子程序是组成应用程序的重要基石;
子程序的规范化撰写,子程序调用前后信息的保护和堆栈的平衡是至关重要的;
高级语言的参数传递往往使用堆栈,只有汇编语言编程可根据使用需要采用寄存器传递参数。这也是汇编语言程序效率高的原因之一。
系统功能调用的思想及方法值得借鉴。;本章习题:
4、5、8
文档评论(0)