模块化程序设计.pptVIP

  1. 1、本文档共64页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
模块化程序设计

第14章 模块化程序设计 14.1 段间调用 14.2 定义外部标识符伪指令 14.3 使用EXTRN和PUBLIC的范例 14.4 在指令段使用PUBLIC 14.5 在数据段使用PUBLIC 14.6 参数传送 14.7 C语言与汇编语言的链接 14.1 段 间 调 用 前面介绍的CALL 指令都是段内的调用,即在同一个指令段内。段内调用的CALL指令范围为0000H~FFFFH。一条段内调用指令(CALL) 的目的码是3个字节长度,例如: E8 2000 (0020) ;十六进制 十六进制E8是段内调用指令(CALL)机器指令的操作码,其操作是先把当前IP指令指针寄存器的值压入堆栈保存,这个值是CALL的下一条指令地址;然后,再把被调用的子程序的偏移地址(2000逆序)值送入IP 寄存器,IP=0020。微处理器把当前CS的值和IP的值相结合形成物理地址,此地址指向被调用子程序的第1字节。当子程序的执行中,遇到RET指令离开子程序返回时,RET指令会从堆栈中弹出IP的保留值,并把它装入IP,使程序返回到CALL的下一条指令继续执行,这个过程是段内调用。 其特点是在子程序调用、返回过程中段寄存器CS不变化,只有指令指针寄存器IP发生变化。主程序与被调用的子程序同在一个段内。 模块化程序设计必然涉及到模块间的调用问题。模块间的调用是通过段间的调用来实现的。若被调用的子程序是在现指令段之外,则称为段间调用。一条段间调用指令(CALL)的机器指令码共有5个字节。例如: 9A 0002 AF04 (04AF 0200) ;十六进制 十六进制9A是段间调用指令(CALL)机器指令的操作码。操作是:首先将CS段寄存器的值压入堆栈,并把被调用子程序所在段的段值(AF04逆序)装入CS段寄存器,CS=04AF;然后把IP指令指针寄存器的值压入堆栈,并将被调用子程序相应的偏移地址(0002逆序)装入IP,IP=0200。 这些操作建立了被调用子程序的第一条待执行指令的地址: 十六进制 段 值: CS 04AF0 偏移地址: IP + 0200 物理地址: 04CF0 当离开子程序返回时,段间调用的RET指令会从堆栈中依序弹出IP和CS两个寄存器的原值,返回到CALL的下一条指令。其特点是在子程序调用、返回过程中,段寄存器CS和指令指针寄存器IP均发生变化。主程序与被调用的子程序不在同一个段内。 14.2 定义外部标识符伪指令 当进行模块化程序设计时,首先应考虑的问题是模块间控制的耦合和数据的耦合。控制耦合就是模块在怎样的环境下如何进入又如何退出。数据耦合就是诸模块间如何进行数据通讯。例如,有一个主模块(MAINPROG)调用一个子模块(SUBPROG),它要用到一个段间调用(CALL),如图14-1所示。 主模块MAINPROG内的CALL指令,必须知道子模块SUBPROG是位于本段之外的标号。否则汇编过程中会产生一个错误信息——指出SUBPROG是一个未定义的符号。EXTRN伪指令就是执行此功能的,它告诉汇编程序SUBPROG是一个远程的标号(FAR Label),是定义在另一个模块里的。因为汇编程序无法知道真是如此,所以就产生“空的”目的操作数0000,即先空出;而由链接程序在链接时再填入确定值。例如(参考例14.4主模块程序清单): 0011 9A0000----E 子模块SUBPROG内含有一个PUBLIC伪指令,它告诉汇编程序和链接程序,其他模块需要知道SUBPROG的地址。当MAINPROG与SUBPROG都已汇编成目的模块文件后,它们可以下列的方式来链接: LINK MAINPROG+SUBPROG Run File [MAINPROG.EXE]: List File [NUL.MAP]: CON Libraries [.LIB]: 链接程序将一个目的模块内的EXTRN匹配上另一个模块内的PUBLIC,并将插入所有需要的偏移地址,然

文档评论(0)

118books + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档