2006/12/02

far 远程指针

far适合near对应的,指的就是远程指针。

下面我们来说一些这个"far"

far不是标准的C语言,而是C语言为了适应32位地址的一种衍生物。

在说之前,我们先来温习一下基础知识:


  Dos 的设计是基于16位的CPU的,也就是CPU中的每个寄存器(Register)只有16位,只能存放0-65535(64K)的值。为了能访问大于64K的内存,人们用了分段的方法,用两个16位的数来记录逻辑上地址,第一个是段值(Segment),第二个是偏移量(Offset),写起来的格式一般是 段值:偏移量。如 0100:0020 (十六进制,地址通常用十六进制的数字) 。这样就有一个32位的地址了。严格来说,因为硬件的缘故,段值个位(当然是十六进制的个位)只能为零,这种分段的方法并不能访问32位范围内的所有地址。
  一般的Dos程序都把执行的代码放在一个段,数据放在另一个段。当然,这只是逻辑上的。而且也有例外,如所有的com格式的程序代码段也放数据。
  Dos 下的16位c编译器(如 TC 2.0, M$ C)产生的可执行文件(exe)都可以选代码模式,例如:Huge, Large, Medium, Small, Tiny(Compact)等等。其区别只在于用多少个段来放代码和数据。



如果上面的你都明白了,下面的就好理解了。
  16位c编译器的整型和指针默认是16位的。默认指针只有偏移量(Offset)的值,只能指向同一段的地方。也叫近程指针(Near Pointer)。当要用指针访问另一个段的地方时,就要定义指针32位的远程指针(Far Pointer)。当程序有多于一个的代码段(如果是函数指针)或数据段(如果是变量指针),而指针和指向的地方不在同一个段的时候,就必须把指针定义为远程指针(Far Pointer)。

其实,一个函数就是内存中的一个地址,这一点就跟数组一样,在函数前面加个far就是使用长一点内存地址!就这么简单!当然,用长地址有它的好处!

什么时候使用far指针?
当使用小代码或小数据存储模式时,不能编译一个有很多代码或数据的程序。因为在64K的一个段中,不能放下所有的代码与数据。为了解决这个问题,需要指定以far函数或far指针来使用这部分的空间(64K以外的空间)。许多库函数就是显式地指定为far函数的形式。far指针通常和farmalloc()这样的内存分配函数一起使用

1 条评论:

匿名 说...

其实就是感觉没什么用处