第4章子程序设计和DOS功能调用教程.doc

  1. 1、本文档共39页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章子程序设计和DOS功能调用教程

第4章子程序设计和DOS功能调用 4.1 子程序设计 子程序——过程——具有特定功能的程序模块 子程序是提高程序设计效率的良好手段,也为模块化设计提供了很好的基础。 4.1.1 过程调用和返回指令 1.call指令——过程调用指令 格式: call 目的操作数 具体格式同jmp 注意:在功能上CALL指令与JMP指令都是要转换到新的位置执行程序,所不同的是,JMP不保护断点,CALL要保护断点。这里的断点是指CALL指令后继第一条指令的起始地址。当执行CALL指令时,CS:IP正指向其后继第一条指令——断点,CALL指令保护之,以便执行完过程后能正确返回调用主程序继续原来程序的执行。可在DEBUG.EXE下观察到CALL保护断点的情况。 ①段内直接调用 call 过程名(near型) 操作:堆栈←ip,ip←ip+相对位移量(汇编结果),ip指向目标 ②段内间接调用 子程序的起始地址(偏移地址)事先存放在通用寄存器或内存单元中 call bx call cx call word ptr [bx+di+2] 操作:堆栈←ip(断点偏移地址),ip←目标地址 ③段间直接调用 call 过程名(far型) 操作: 堆栈←[cs:ip](断点地址),[cs:ip]←目标地址 ④段间间接调用 子程序的起始地址(逻辑地址:偏移地址)存放在四字节的地址指针中 call dword ptr[bx] 操作: 堆栈←[cs:ip](断点地址),[cs:ip]←目标地址 2. ret指令——过程返回指令 格式: ret ret n(弹出值为偶数) 功能: ①ret 指令将控制从一个过程返回到调用该过程的call指令之后的那条指令(调用程序的断点),段内或段间返回都用RET. ret完成由堆栈恢复断点的功能 : 段内返回:ip←断点偏移量 段间返回:ip←断点偏移量 cs←断点段地址 ②带弹出值的返回指令,其弹出值只能是偶数,在从堆栈中弹出返回地址后,再次修改堆栈指针sp的值: sp←sp+n 以废除调用程序装入栈中的参数恢复调用之前的栈顶。把执行call指令前压入堆栈的参数弹出丢去. 注意:以标号开始,以RET结束的程序段均可以视为子程序,用CALL调用: data segment pr1 db abcdefg,0dh,0ah,24h data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax call disp mov ah,9 lea dx,pr1 int 21h mov ah,4ch int 21h disp: lea dx,pr1 mov ah,9 int 21h ret code ends end start 4.1.2 过程定义语句 格式: 过程名 proc [near/far] .... ret .... ret 过程名 endp 说明:①过程名不能省略,proc和endp前的过程名必须相同 ②near————近调用过程,即仅能被同一逻辑代码段的程序调用. far——远调用过程,即能被其他逻辑代码段的程序调用. 如果无类型说明,隐含near. ③过程调用与返回 主程序用call命令调用过程,执行完后,在过程中执行ret返回主程序,所以在过程中,一般最后一条语句均为ret指令 ④过程的嵌套与递归——汇编程序也允许过程的嵌套调用和递归调用 过程嵌——在过程中调用过程 过程递归——过程调用自己 这两种调用方式都是依靠CALL指令和RET指令配合实现的。 子程序的编写方法 1.子程序的定义 ⑴调用程序与子程序在同一代码段中,子程序的类型为near code segment assume ..... main proc far ..... call sub ..... ret main endp sub proc near .... ret sub endp code ends ⑵调用程序与子程序不在同一代码段中,子程序必须是far型 c

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档