- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
六种编译模式
六种编译模式概述:函数后面接large等关键字六种编译模式概述Turbo?C?提供了六种编译模式。编译模式有时也称为寻址模式或内存模式,因为它处理的就是如何在内存中为程序,数据,堆栈分配空间并存取它们,这六种模式是:微模式tiny,小模式small,?紧凑模式compact,中模式medium,大模式large,巨模式huge。它们之间的关系如下表所示。│?小程序?│?大程序━━━━┿━━━━━━┿━━━━━━━━小数据?│?微,小?│?中大数据?│?紧凑?│?大,巨?所谓小程序就是只有一个程序段,当然不超过64K?字节,缺省的码(函数)指针是near。所谓大程序就是有多个程序段,每个程序段不超过64K字节,但总程序量可超过64K字节,缺省的码指针是?far。所谓小数据就是只有一个数据段,缺省的数据指针是near。所谓大数据就是有多个数据段,缺省的数据指针是?far。下面还会逐个谈到它们之间的差别,并通过同一程序在六种不同模式下的输出结果,来进一步加深对这六种模式的理解。但先要强调一点:无论使用哪一种编译模式,单个的Turbo?C源文件不可能生成大于64K字节的代码,也不能生成大于64K字节的静态(包括全局)数据。例如下面这个程序:?int?a[15000],b[20000];void?main(){}在任何模式下都不能编译。这是因为,两个数组所要求的总存储量达70K字节。编译时会报出Too?much?global?data?defined?in?file的出错信息。为了处理大于64K?字节的代码或静态数据,必须分成几个源文件。以上面这个程序为例,可以分成文件A1.C和A2.C,分别用巨模式对这两个源文件进行编译,最后连接成一个可执行文件。?al.c?a2.c?a.prjint?a[15000];?int?b[20000];?a1void?main()?a2a1.obj(30k)?a2.obj(40k)?a.exe(71k)六种编译模式的差别是:它们对来自不同源文件的码和数据段的处理不同,对动态分配的堆空间的处理不一样,对指针使用也不一样。此外,它们的所形成的?.obj?文件中传给连接程序的信息也不一样,以便连接程序相应地安排码段和数据段,把相应的说明放在?.exe?文件的头中并借此通知DOS:当执行这个程序时如何装入码段和数据段,如何设置各个段寄存器。用于演示六种编译模的程序是由两个源文件X.C和Y.C组成,如下所示:/*?X.C?*/#includegeneral.hvoid?a(){static?int?b;int?c;printf(In?function?A? );printf(?CS?:?%X? ,_CS);printf(?DS?:?%X? ,_DS);printf(?SS?:?%X? ,_SS);printf(?Static?B?:?%p? ,b);pritnf(?Automatic?C?:?%p? ,c);}/*?Y.C?*/#includegeneral.hint?d;void?main(){int?e;a();printf(In?function?main? );printf(?CS?:?%X? ,_CS);pritnf(?DS?:?%X? ,_DS);pritnf(?SS?:?%X? ,_SS);pritnf(?Global?D?:?%p? ,d);pritnf(?Automatic?E?:?%p? ,e);printf(?Heap?address?:?%p? ,malloc(2));#if?defined(__TINY__)||defined(__SMALL__)||defined(__COMPACT__)pritnf(Function?A?:?%Np? ,a);pritnf(Function?main?:?%Np? ,main);}#elseprintf(Function?A?:?%Fp? ,a);printf(Function?main?:?%Fp? ,main);}#endif?第一个源文件包含函数a和一个静态(局部)变量b,第二个源文件包含主函数main和一个全局变量d?。两个源文件中各含有一个自动变量c和e。第二个源文件的主函数main调用了第一个源文件中的函数a,还调用了Turbo?C?的库函数malloc去分配一块堆空间。两个源文件是分别编译的,然后再通过连接程序连接起来。通过以六种不同模式编译这两个源文件,可以看到它们是如何为码、数据和堆栈段分配空间,可以看到静态变量、自动变量和堆变量分别存放在什么位置,函数放在什么地方。正如下面将要
文档评论(0)