的指外类型,这就是基based指针。基指针综合实现了近和远指针的优点,
f它像近指针那么小那么快,又像远指针那样可以寻址缺省数据段以外的目标。基指针这个名字就反映了这类指针上的实现方法:它是以程序员指定的某一地址为段基址。如果在C源程序中使用了基指针,编译程序一般先把所指定的段基址装在ES寄存器内。在缺省的数据段内,程序员一般不会使用基指针。但若同时要使用多个数据段,基指则有其明显的优点。一、近
ear指针近指针是用于不超过64K字节的单个数据段或码段。对于数据指针,在微、小和中编译模式下产生的数据指针是近指针,因为此时只有一个不超过64K字节的数据段。对于码即函数指针指针,在微、小和紧凑编译模式下产生的码指针是近指针,因为此时只一个不超过64K字节的码段。本章将只讨论数据指针。近指针是16位指针,它只含有地址的偏移量部分。为了形成32位的完整地址,编译程序一般是反近指针与程序的数据段的段地址组合起来。因为在大部分情况下程序的数据段的段地址是装在DS寄存器内,因此一般没有必要装载这个寄存器。此外,当用汇编语言和C语言混合编程时,汇编语言总是假设DS含有数据目标的地址。虽然近指针占用空间最小,执行速度最快,但它有一个严格的限制,即只能64K字节以内的数据,且只能存取程序的数据段内的数据。如果在小模式下编译一个程序,而这个程序企图增量一个近指针使之超过第65536个字节,则这个近的指针就会复位到0。下面就是这样一个例子:char_
earpchar_
ear0xffffp由于近指针的这个严重限制,所有在比较大或比较复杂的程序中,都无法使用。二、远far指针远指针不是让编译程序把程序数据段地址作为指针的段地址部分,而是把指针的段地址与指针的偏移量直接存放在指针内。因此,远指针是由4个字节构成。它可以指向内存中的任一目标,可以用于任一编译模式,尽管仅在紧凑、大和巨模式下远指针才是缺省的数据指针。因为远指针的段地址在指针内,熟悉80X86汇编语言的人都知道,这意味着每次使用远指针时都需要重新装载段寄存器,这显然会降低速度。应该注意:尽管远指针可以寻址内存中的任一单元,但它所寻址的目标也不能超过64K字节。这是因为,远指针在增量或减量之类的算术运算时,也只是偏移量部分参与运算,而段地址保持不变。因此,当远指针增量或减量到超过64K字节段边界时就出错。例如:charfarfpcharfar0xb800fffffp在指针加1以后,fp将指向B800:0000,而不是r