网站大量收购独家精品文档,联系QQ:2885784924

六种编译模式.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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.prj int?a[15000];?int?b[20000];?a1 void?main()?a2 a1.obj(30k)?a2.obj(40k)?a.exe(71k) 六种编译模式的差别是:它们对来自不同源文件的码和数据段的 处理不同,对动态分配的堆空间的处理不一样,对指针使用也不一样。 此外,它们的所形成的?.obj?文件中传给连接程序的信息也不一样, 以便连接程序相应地安排码段和数据段,把相应的说明放在?.exe?文 件的头中并借此通知DOS:当执行这个程序时如何装入码段和数据段, 如何设置各个段寄存器。 用于演示六种编译模的程序是由两个源文件X.C和Y.C组成,如下 所示: /*?X.C?*/ #includegeneral.h void?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.h int?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); } #else printf(Function?A?:?%Fp? ,a); printf(Function?main?:?%Fp? ,main); } #endif?第一个源文件包含函数a和一个静态(局部)变量b,第二个源文件 包含主函数main和一个全局变量d?。两个源文件中各含有一个自动变 量c和e。第二个源文件的主函数main调用了第一个源文件中的函数a, 还调用了Turbo?C?的库函数malloc去分配一块堆空间。两个源文件是 分别编译的,然后再通过连接程序连接起来。 通过以六种不同模式编译这两个源文件,可以看到它们是如何为 码、数据和堆栈段分配空间,可以看到静态变量、自动变量和堆变量 分别存放在什么位置,函数放在什么地方。正如下面将要

文档评论(0)

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

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

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档