near_far_huge指针区别

near_far_huge指针区别

ID:40563590

大小:39.50 KB

页数:4页

时间:2019-08-04

near_far_huge指针区别_第1页
near_far_huge指针区别_第2页
near_far_huge指针区别_第3页
near_far_huge指针区别_第4页
资源描述:

《near_far_huge指针区别》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、near指针,far指针,huge指针1、near指针和far指针在DOS下(实模式)地址是分段的,每一段的长度为64K字节,刚好是16位(二进制的十六位)。near指针的长度是16位的,所以可指向的地址范围是64K字节,通常说near指针的寻址范围是64K。far指针的长度是32位,含有一个16位的基地址和16位的偏移量,将基地址乘以16后再与偏移量相加,(所以实际上far指针是20位的长度。)即可得到far指针的1M字节的偏移量。所以far指针的寻址范围是1M字节,超过了一个段64K的容量。例如一个far指针的段地址为0x7000,偏移量为0x1244,则该指针指向地址0x71224.如果

2、一个far指针的段地址是0x7122,偏移量为0x0004,则该指针也指向地址0x71224。如果没有指定一个指针是near或far,那么默认是near。所以far指针要显式指定。far指针工作起来要慢一些,因为每次访问一个far指针时,都要将数据段或程序段(指令指针寄存器IP与代码寄存器CS)的数据交换出来。另外,far指针的运算也比较反常,例如上面讲到的far指针指向同一个地址,但是比较的结果却不相同。2、什么时候使用far指针当使用小代码或小数据存储模式时,不能编译一个有很多代码或数据的程序。因为在64K的一个段中,不能放下所有的代码与数据。为了解决这个问题,需要指定以far函数或far

3、指针来使用这部分的空间(64K以外的空间)。许多库函数就是显式地指定为far函数的形式。far指针通常和farmalloc()这样的内存分配函数一起使用。FAR指针是

4、段地址:偏移地址

5、的形式HUGE指针也是

6、段地址:偏移地址

7、的形式 因为可以有每个段都是64K的,可以寻址多个段,所以这种指针的寻址范围很大,如果你的程序代码或者数据超过了64K,就只能用FAR指针或HUGE指针来操作了。   它们二者也是有区别的:HUGE指针是经过规范过的,可以直接比较大小。不过由于要处理后进行比较,所以运算速度较慢。FAR指针不能直接比较大小,但由于只比较偏移量,所以FAR指针的运算速度较快,你可以根据需要

8、选用 。一、近(near)指针近指针是用于不超过64K字节的单个数据段或码段。对于数据指针,在微、小和中编译模式下产生的数据指针是近指针,因为此时只有一个不超过64K字节的数据段。对于码(即函数指针)指针,在微小和紧凑编译模式下产生的码指针是近指针,因为此时只一个不超过64K字节的码段。这里只讨论数据指针。近指针是16位指针,它只含有地址的偏移量部分。为了形成32位的完整地址,编译程序一般是反近指针与程序的数据段的段地址组合起来。因为在大部分情况下程序的数据段的段地址是装在DS寄存器内,因此一般没有必要装载这个寄存器。此外,当用汇编语言和C语言混合编程时,汇编语言总是假设DS含有数据目标的地址

9、。虽然近指针占用空间最小,执行速度最快,但它有一个严格的限制,即只能64K字节以内的数据,且只能存取程序的数据段内的数据。如果在小模式下编译一个程序,而这个程序企图增量一个近指针使之超过第65536个字节,则这个近的指针就会复位到0。下面就是这样一个例子:char _near *p=(char _near *)0xffff; p++; 由于近指针的这个严重限制,所有在比较大或比较复杂的程序中,都无法使用。二、远(far)指针远指针不是让编译程序把程序数据段地址作为指针的段地址部分,而是把指针的段地址与指针的偏移量直接存放在指针内。因此,远指针是由4个字节构成。它可以指向内存中的任一目标,可以用

10、于任一编译模式,尽管仅在紧凑、大和巨模式下远指针才是缺省的数据指针。因为远指针的段地址在指针内,熟悉80X86汇编语言的人都知道,这意味着每次使用远指针时都需要重新装载段寄存器,这显然会降低速度。应该注意:尽管远指针可以寻址内存中的任一单元,但它所寻址的目标也不能超过64K 字节。这是因为,远指针在增量或减量之类的算术运算时,也只是偏移量部分参与运算,而段地址保持不变。因此,当远指针增量或减量到超过64K字节段边界时就出错。例如:char far *fp=(char far *)0xb800ffff; fp++; 在指针加1以后,fp将指向B800:0000,而不是所希望的C800:0000。

11、 此外,在进行指针比较时,far指针还会引起另外一些问题。far指针是由偏移量和段地址这样一对16位数来表示的,对于某一实际内存地址,far指针不是唯一的,例如,far指针1234:0005、1230:0045、1200:0345、1000:2345、0900:9345等都是代表实际地址12345,这样会引起许多麻烦。 第一,为了便于与“空”(NULL)指针(0000:0000)进行比较,当关系操

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。