汇编语言——子程序.ppt

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

* * 6.2 子程序的基本格式和有关指令 6.2.1 汇编语言子程序格式 子程序是具有固定功能的程序段,并且有规定的格式。不同的计算机语言对子程序格式的规定不同,汇编语言的子程序基本格式如下: 子程序名 PROC 类型 指令序列 子程序名 ENDP 格式中的首尾两行表示一个子程序的开始和结束,都属于伪指令。“子程序名”是一个标识符,是编程者给子程序起的名字。子程序名同时还代表子程序第一条指令所在的逻辑地址,称为子程序的入口地址。“类型”只有NEAR和FAR两种,它将影响汇编程序对子程序调用指令CALL和返回指令RET的翻译方式。被夹在子程序起止伪指令之间的指令序列是完成子程序固定功能的程序段,通常指令序列的最后一条指令是返回指令RET。 6.2.2 子程序相关指令 6.2.2.1 CALL指令 【指令格式】CALL 子程序名 【功能】这是调用子程序的指令。根据被调用的子程序的类型不同,CALL指令的功能分为两种情况: (1)如果被调用的子程序是NEAR类型,则先把当前指令指针IP的值入栈,这会使SP的值减2,然后把IP改成子程序的第1条指令的偏移地址。 (2)如果被调用的子程序是FAR类型,则先把当前CS寄存器的值入栈,再把IP入栈,结果会使SP的值减4,然后把CS和IP改为子程序第1条指令的逻辑地址。 CALL也是一种跳转指令,与无条件跳转及条件跳转指令不同的是,CALL在跳转之前先预留了回来的方法,把IP的当前值或CS与IP的当前值入栈保存。从CS与IP 的作用可以知道,它们存放的是正在执行的指令的下一条指令的逻辑地址,现在这一地址被保存在堆栈中。于是回来的方法就显而易见了,只要从栈中取出逻辑地址值,送回IP或者CS与IP即可。这种返回操作就是由RET指令实现的。 6.2.2.2 RET指令 【指令格式】RET 【功能】这是子程序返回指令,必须写在子程序的指令序列之中。根据所在的子程序的类型不同,RET指令的功能也分为两种情况: (1)如果RET所在子程序是NEAR类型,则从堆栈中出栈一个字(当然,SP会加2),送给IP。 (2)如果RET所在子程序是FAR类型,则先从堆栈中出栈一个字送到IP,再出栈一个字送到CS,栈顶指SP的值加4。 CALL指令和RET指令都具有跳转的能力,与条件跳转及无条件跳转一样,都是通过修改IP或者CS与IP来实现的。不论跳转是由哪一条指令造成的,对于只改变IP 的跳转,跳转的目的地与跳转指令必然在同一个代码段内,这种跳转称为段内跳转。相应地,CALL指令功能的第一种情况称为段内调用,RET指令功能的第一种情况称为段内返回。另一种跳转是同时改变了CS和IP的值,这就允许跳转指令与跳转目的地不在同一个段中,使得跳转的目的地可以在整个内存空间的任何位置,这一类跳转称为段间跳转。CALL指令功能的第二种情况称为段间调用,RET指令功能的第二种情况称为段间返回。 6.2.3 子程序的调用与返回 在汇编语言程序中,子程序分为定义和使用两部分。在较短的程序中,通常把子程序与其余指令写在同一个代码段内,一个代码段中可以定义多个子程序,并且都定义成NEAR类型。这样编写的代码段的基本结构如下: 段名 SEGMENT 子程序1 PROC NEAR 子程序1 ENDP 子程序2 PROC NEAR 子程序2 ENDP 子程序n PROC NEAR 子程序n ENDP 入口标号: ? 段名 ENDS 从入口标号起的程序段是主程序。RET指令必须出现在子程序中,而CALL指令可以出现在代码段的任何地方。主程序可以调用子程序,一个子程序可以调用另一个子程序,还可以调用它自身,并且在书写次序上没有“先定义后调用”的限制。 源程序中的指令段在经过汇编程序的翻译后,所有伪指令都不存在了。作为CALL指令的操作数,“子程序名”部分会翻译成子程序第一条指令的逻辑地址。当计算机在执行CALL 指令时,CS和IP已经是下一条指令的逻辑地址。CALL指令具有保存当前IP或者CS和IP并修改它们的值的能力,因此CALL执行完后,

文档评论(0)

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

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

1亿VIP精品文档

相关文档