欢迎来到天天文库
浏览记录
ID:26980789
大小:474.01 KB
页数:64页
时间:2018-11-30
《《模块化程序设计》ppt课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第14章模块化程序设计14.1段间调用14.2定义外部标识符伪指令14.3使用EXTRN和PUBLIC的范例14.4在指令段使用PUBLIC14.5在数据段使用PUBLIC14.6参数传送14.7C语言与汇编语言的链接14.1段间调用前面介绍的CALL指令都是段内的调用,即在同一个指令段内。段内调用的CALL指令范围为0000H~FFFFH。一条段内调用指令(CALL)的目的码是3个字节长度,例如:E82000(0020);十六进制十六进制E8是段内调用指令(CALL)机器指令的操作码,其操作是先把当前IP指令
2、指针寄存器的值压入堆栈保存,这个值是CALL的下一条指令地址;然后,再把被调用的子程序的偏移地址(2000逆序)值送入IP寄存器,IP=0020。微处理器把当前CS的值和IP的值相结合形成物理地址,此地址指向被调用子程序的第1字节。当子程序的执行中,遇到RET指令离开子程序返回时,RET指令会从堆栈中弹出IP的保留值,并把它装入IP,使程序返回到CALL的下一条指令继续执行,这个过程是段内调用。其特点是在子程序调用、返回过程中段寄存器CS不变化,只有指令指针寄存器IP发生变化。主程序与被调用的子程序同在一个段内
3、。模块化程序设计必然涉及到模块间的调用问题。模块间的调用是通过段间的调用来实现的。若被调用的子程序是在现指令段之外,则称为段间调用。一条段间调用指令(CALL)的机器指令码共有5个字节。例如:9A0002AF04(04AF0200);十六进制十六进制9A是段间调用指令(CALL)机器指令的操作码。操作是:首先将CS段寄存器的值压入堆栈,并把被调用子程序所在段的段值(AF04逆序)装入CS段寄存器,CS=04AF;然后把IP指令指针寄存器的值压入堆栈,并将被调用子程序相应的偏移地址(0002逆序)装入IP,IP=
4、0200。这些操作建立了被调用子程序的第一条待执行指令的地址:十六进制段值:CS04AF0偏移地址:IP+0200物理地址:04CF0当离开子程序返回时,段间调用的RET指令会从堆栈中依序弹出IP和CS两个寄存器的原值,返回到CALL的下一条指令。其特点是在子程序调用、返回过程中,段寄存器CS和指令指针寄存器IP均发生变化。主程序与被调用的子程序不在同一个段内。14.2定义外部标识符伪指令当进行模块化程序设计时,首先应考虑的问题是模块间控制的耦合和数据的耦合。控制耦合就是模块在怎样的环境下如何进入又如何退出。数
5、据耦合就是诸模块间如何进行数据通讯。例如,有一个主模块(MAINPROG)调用一个子模块(SUBPROG),它要用到一个段间调用(CALL),如图14-1所示。EXTRNSUBPROG:FARMAINPROG:…CALLSUBPROG…PUBLICSUBPROGSUBPROG:…RET图14-1段间调用主模块MAINPROG内的CALL指令,必须知道子模块SUBPROG是位于本段之外的标号。否则汇编过程中会产生一个错误信息——指出SUBPROG是一个未定义的符号。EXTRN伪指令就是执行此功能的,它告诉汇编程序
6、SUBPROG是一个远程的标号(FARLabel),是定义在另一个模块里的。因为汇编程序无法知道真是如此,所以就产生“空的”目的操作数0000,即先空出;而由链接程序在链接时再填入确定值。例如(参考例14.4主模块程序清单):00119A0000----E子模块SUBPROG内含有一个PUBLIC伪指令,它告诉汇编程序和链接程序,其他模块需要知道SUBPROG的地址。当MAINPROG与SUBPROG都已汇编成目的模块文件后,它们可以下列的方式来链接:LINKMAINPROG+SUBPROGRunFile[MA
7、INPROG.EXE]:ListFile[NUL.MAP]:CONLibraries[.LIB]:链接程序将一个目的模块内的EXTRN匹配上另一个模块内的PUBLIC,并将插入所有需要的偏移地址,然后把两个目的模块组合成一个可执行的文件。若有不匹配的情况,链接程序会给出错误信息。利用EXTRN和PUBLIC这两条伪指令,一个模块可以访问其他模块的标识符(变量或者标号)。如果一个标识符只在这一个模块中定义过,那么它相对这个模块就是一个内部的标识符或局部标识符。如果它没有在这一个模块中定义过,而是在其他一个模块中定
8、义过,那么它相对于该模块就称为外部标识符。对于只产生一个单一目标模块的汇编语言程序而言,它所访问的所有标识符必须是局部(内部)定义的,否则就会产生一个错误信息——汇编程序会查出有一个未定义的标识符(标号或变量)存在。对于多模块程序来说,必须给汇编程序一个信息以说明其间的有些标识符是外部的,而不至于汇编程序把它们理解为一些无效的标识符。此外为了允许其他模块访问本给定模块中的标识符,该给定
此文档下载收益归作者所有