c语言之far指针(转)

本文探讨了16位C语言中64K内存限制的问题,并详细解释了FAR指针的使用,包括其在参数传递、返回值、存储和局限性方面的行为。通过汇编和C语言的示例,揭示了FAR指针如何帮助扩展访问内存的范围,尽管仍受制于64K段限制。
摘要由CSDN通过智能技术生成

1、64K限制的困扰

 

我们考虑下面一段16位C语言代码片断:

char g_c;

void func (char *p)

{

 char c;

 

 p = &c;

 p = &g_c;

 p = (char *)malloc(10 * sizeof(char));

 free(p);

 

 return;

}

显然,g_c是全局变量,按照教科书的说法,它应该放在全局变量区,c是局部变量,因此c放在栈区,而malloc所申请的空间应该是在堆区。上面的代码从语义上讲没有半点错误,一个指针p可以指向全局变量区的内存,也可以指向堆区或栈区的内存。

大家知道,16Bit C语言的指针是16位的,因此只能访问64K大小的空间,然而我们使用指针对全局变量,堆,栈进行寻址的时候,都没有指定一个数据段。那么也就是说,全局变量,堆以及栈都是在同一个段中的,这三部分的大小加起来不可能大于64K,这也是malloc的参数int类型的最大表示范围。

按照我的理解这64K应该是这样的:

64K最顶端是栈区(因为栈总是从上往下的),一般我们在程序的开始会设置SS的内容和DS一样,SP的值为0,如果有进栈操作的话,SP会减少2,而变成从FFFE,然后往下减。

64K最底端是数据区(这部分是固定的,堆和栈是可变的),我们声明了Data Segment之后,一般会将Data Segment的段起始地址给DS,然而,Data Segment中的变量是按顺序从低往高排的,一旦编译连接成可执行文件之后,这部分内容的大小(或称为长度)是不会变的。我们可以更改的是堆和栈的大小。

堆区位于数据区以上部分,也就是如果堆区的不断增长,或者栈区的不断进栈,最终可能造成堆区和栈区交叉,也就是我们俗称的堆栈溢出。

或许会有些疑问,认为我将局部变量放在栈区是不对的,这里就这部分内容再展开讨论一下,对于函数的参数是放在栈区的,大家不会有所怀疑,因为函数调用除了使用寄存器传递参数之外只能使用堆栈传递了(当然使用全局变量也可以,不过这里只讨论形参与实参的传递),因此调用Func的过程伪代码如下所示:

 lea bx, p

 push bx

 call func

苹果CMS程序是一套采用PHP+MYSQL环境下运行的完善而强大的快速建站系统。 经过近多年的开发经验和技术积累,苹果CMS程序已逐步走向成熟,在易用性和功能上已经成为同行中的佼佼者。 程序体积小->优化程序代码,运行速度快->高效的缓存处理,只要普通的虚拟主机就可以完美搭建起来,建站成本非常低。仿MVC模板分离,内置标签,自定义函数标签接口,强大的自定义采集功能,只要你会HTML就可以轻松做出个性化的网站。 程序易用性和功能上一直以来都积极采纳广大站长提出的各种好的建议,迅速响应各种紧急问题,我们的服务理念贯穿其中,保证每一位站长每一个环节都可以从容应对。 v10采用tp5.x内核进行开发,扩展了模板处理引擎,将后台程序与html模板简单的分离出来,让设计人员与程序人员最大限度的发挥自己的优势而互不干扰,大大加快了项目有序、快速的完成。 即使您是第一次接触,也会在最短的时间内熟练掌握它的使用方法。后台管理模块,一目了然,操作简单,绝对不会让您眼花缭乱。 更新日志: 2018.09.14.0850 1,修复API接口数据按分类过滤的问题。 2,新增标签comment、gbook自定义pageurl分页参数。 3,新增标签comment、gbook的uid参数,可获取某个用户的数据。 4,新增后台用户管理头像上传。 5,优化后台视频管理播放器、下载器、服务器组按照序号排序。 6,新增百度主动推送、百度熊掌号推送。 7,优化获取头像方法判断头像存不存在返回默认地址。 8,新增短信发送配置(内置腾讯云、阿里云短信发送)。 9,新增用户注册、绑定、找回密码使用手机短信的方式;可在会员设置中开启。 10,修复采集入库介绍随机插入文字的问题。 11,其他细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值