- 1、本文档共98页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编语言09解析
汇编语言课件09子程序设计 子程序设计 子程序是功能相对独立并具有一定通用性的程序段,有时还将它作为一个独立的模块供多个程序使用。将常用功能编成通用的子程序是一个经常采用的程序设计方法。这种方法不仅可以简化主程序、实现模块化;还可以重复利用已有的子程序,提高编程效率。 子程序需要调用才能被执行,所以也被称为“被调用程序”;与之相对应,使用子程序的程序就是主程序,也称为“调用程序”。 在汇编语言中,子程序(Subroutine)要用过程(Procedure)伪指令定义。 过程声明由一对过程伪指令PROC和ENDP完成,格式如下: 过程名 PROC [NEAR|FAR] …… ;过程体 过程名 ENDP 过程名为符合语法的标识符,每个子程序应该具有一个唯一的子程序名。可选的参数指定过程的调用属性。没有指定过程属性,则采用默认属性。 对简化段定义格式,在微型、小型和紧凑存储模式下,过程的默认属性为 NEAR;在中型、大型和巨型存储模式下,过程的默认属性为 FAR。 对完整段定义格式,过程的默认属性为NEAR 子程序调用与返回指令 当经常需要执行一段特定功能的指令序列时,就可以把它编写成一个子程序。当主程序(调用程序)需要执行这个功能时,用 CALL指令调用该子程序(被调用程序);于是,程序转移到这个子程序的起始处执行。在子程序最后,用RET指令返回调用它的主程序,继续执行后续指令。 CALL和RET指令均不影响标志位。 1. 子程序调用指令CALL CALL指令可以分成4种情况(类似无条件转移JMP指令): 相对寻址的段内调用CALL指令,需要将IP压入堆栈,然后转移 CALL label ;IP入栈:SP←SP-2,SS:[SP]←IP ;实现转移:IP←IP+16位位移量 间接寻址的段内调用 CALL指令,需要将IP压入堆栈,然后转移 CALL r16/m16 ; IP入栈:SP←SP-2,SS:[SP]←IP ;实现转移:IP←r16/m16 直接寻址的段间调用 CALL指令,需要将CS和IP压入堆栈,然后转移 CALL far ptr label ; CS入栈:SP←SP-2,SS:[SP]←CS ; IP入栈:SP←SP-2,SS:[SP]←IP ;实现转移:IP←label偏移地址,CS←label 段地址 间接寻址的段间调用 CALL指令,需要将CS和IP压入堆栈,然后转移 CALL far ptr mem ; CS入栈:SP←SP-2,SS:[SP]←CS ; IP入栈: P←SP-2,SS:[SP]←IP ;实现转移:IP←[mem],CS←[mem+2] 2. 子程序返回指令RET RET指令用在子程序中,实现子程序的返回。根据返回范围和有无参数, RET指令也有4种情况: RET ;无参数、段内返回。 弹出IP: IP←SS : [SP],SP←SP+2 RET i16 ;有参数、段内返回。弹出IP: IP←SS : [SP],SP←SP+2 ;调整指针:SP←SP+i16 RET(RETF) ;无参数、段间返回。 弹出I P:IP←SS : [SP],SP←SP+2 弹出CS:CS←SS: [SP],SP←SP+2 RET i16 (RETF i16 ) ;有参数段间返回: 弹出 IP: IP←SS:[SP],SP←SP+2 弹出CS:CS←SS:[SP],SP←SP+2 调整指针:SP← SP+i16 例 编写一个子程序,将AX的数据(无符号)变为十进制并显示 子程序设计需要留意几个问题: (1) 子程序要利用过程定义伪指令声明,获得子程序名和调用属性。 (2) 子程序最后利用RET指令返回主程序,主程序执行CALL指令调用子程序。 (3) 子程序中对堆栈的压入和弹出操作要成对使用,保持堆栈的平衡。 (4) 子程序开始应该保护用到的寄存器内容,子程序返回前进行相应恢复。 (5) 子程序允许嵌套和递归 子程序内包含有子程序的调用,这就是子程序嵌套。嵌套深度(层次)在逻辑上没有限制,但受限于开设的堆栈空间 当子程序直接或间接地嵌套调用自身时称为递归调用,含有递归调用的子程序称为递归子程序。递归子程序的设计有一定难度,但往往能设计出效率较高的程序。 (6) 子程序可以与主程序共用一个数据段,也可以使用不同的数据段(注意修改DS)。如果子程序使用的数据或变量不需要与其它程序共享,可以在子程序最后设置数据区、定义局部变量。此时,子程序应该采用CS寻址这些数据。 例 将AL低4位表达的一
文档评论(0)