曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4750|回复: 0
打印 上一主题 下一主题

远指针

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2009-4-14 01:34:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
远(far)指针
远指针不是让编译程序把程序数据段地址作为指针的段地址部分,
而是把指针的段地址与指针的偏移量直接存放在指针内。因此,远指
针是由4 个字节构成。它可以指向内存中的任一目标,可以用于任一
编译模式,尽管仅在紧凑、大和巨模式下远指针才是缺省的数据指针。
因为远指针的段地址在指针内,熟悉80X86 汇编语言的人都知道,这
意味着每次使用远指针时都需要重新装载段寄存器,这显然会降低速
度。
应该注意:尽管远指针可以寻址内存中的任一单元,但它所寻址
的目标也不能超过64K 字节。这是因为,远指针在增量或减量之类的
算术运算时,也只是偏移量部分参与运算,而段地址保持不变。因此,
当远指针增量或减量到超过64K字节段边界时就出错。例如: char far *fp=(char far *)0xb800ffff;
fp++; 在指针加1以后,fp将指向B800:0000,而不是所希望的
C800:0000。
此外,在进行指针比较时,far指针还会引起另外一些问题。far
指针是由偏移量和段地址这样一对16位数来表示的,对于某一实际内
存地址,far指针不是唯一的,例如,far指针1234:0005、1230:0045、
1200:0345、1000:2345、0900:9345等都是代表实际地址12345,这样
会引起许多麻烦。
第一,为了便于与“空”(NULL)指针(0000: 0000)进行比较,当
关系操作符“==”和“!=”用于对far 指针进行比较时,比较的是全
部32位。否则,如果只比较16位偏移量,那么任何偏移量为0 的指针
都将是“空”(NULL)指针,这显然不符合一般使用要求。但在进行这
32位比较时,不是按20位实际地址来比较,而是把段地址和偏移量当
作一个32位无符号长整数来比较。对于上面这个例子,假设这些指针
分别叫作a、b、c、d、e,尽管这5个far 指针指向的都是同一内存单
元,但下列表达式运算的结果却都为“假”,从而得出错误的结论:
if(a==b)....
if(b==c)....
if(c==d)....
if(d==e)....
if(a==c)....
if(a==d)....
第二,当用“>”、“>=”,“<”和“<=”关系操作符对指针进
行比较操作时,比较的仅仅是偏移量部分,即按无符号的16位整数进
行比较。因此,对于上面这个例子,下列表达式运算的结果将都为
“真”,也得出错误的结论:
if(e>d)....
if(d>c)....
if(c>b)....
if(b>a)....
if(e>a)....
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-13 12:12 , Processed in 0.072567 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表