C/C++中的近指令、远指针和巨指针

在我们的C/C++学习生涯中、在我们大脑的印象里,通常只有指针的概念,很少听说指针还有远、近、巨之分
的,从没听说过什么近指针、远指针和巨指针。
可以,某年某月的某一天,你突然看到这样的语句:
char near *p; /*定义一个字符型“近”指针*/
char far *p; /*定义一个字符型“远”指针*/
char huge *p; /*定义一个字符型“巨”指针*/
实在不知道语句中的“near”、“far”、“huge”是从哪里冒出来的,是个什么概念!本文试图对此进行解答,解
除许多人的困惑。
这一点首先要从8086 处理器体系结构和汇编渊源讲起。大家知道,8086 是一个16 位处理器,它设定
了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):
数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。8086 采
用段式访问,访问本段(64K 范围内)的数据或指令时,不需要变更段地址(意味着段地址寄存器不需修改),
而访问本段范围以外的数据或指令时,则需要变更段地址(意味着段地址寄存器需要修改)。
因此,在16 位处理器环境下,如果访问本段内地址的值,用一个16 位的指针(表示段内偏移)就可以
访问到;而要访问本段以外地址的值,则需要用16 位的段内偏移+16 位的段地址,总共32 位的指针。
这样,我们就知道了远、近指针的区别:
Ø 近指针是只能访问本段、只包含本段偏移的、位宽为16 位的指针;
Ø 远指针是能访问非本段、包含段偏移和段地址的、位宽为32 位的指针。
近指针只能对64k 字节数据段内的地址进行存取,如:
char near *p;
p=(char near *)0xffff;
远指针是32 位指针,它表示段地址:偏移地址,远指针可以进行跨段寻址,可以访问整个内存的地址。如定
81
义远程指针p 指向0x1000 段的0x2 号地址,即1000:0002,则可写作:
char far *p;
p=(char far *)0x10000002;
除了远指针和近指针外,还有一个巨指针的概念。
和远指针一样,巨指针也是32 位的指针,指针也表示为16 位段:16 位偏移,也可以寻址任何地址。它和远
指针的区别在于进行了规格化处理。远指针没有规格化,可能存在两个远指针实际指向同一个物理地址,但是
它们的段地址和偏移地址不一样,如23B0:0004 和23A1:00F4 都指向同一个物理地址23604!巨指针通过
特定的例程保证:每次操作完成后其偏移量均小于10h,即只有最低4 位有数值,其余数值都被进位到段地址
上去了,这样就可以避免Far 指针在64K 边界时出乎意料的回绕的行为。当然,一次操作必须小于64K。下
面的函数可以将远指针转换为巨指针:
void normalize(void far ** p)
{
*p=(void far *)(((long)*p&0xffff000f)+(((long)*p&0x0000fff00<<12));
}
从上面的函数中我们再一次看到了指针之指针的使用,这个函数要修改指针的值,因此必须传给它的指针的指
针作为参数。
讲到这里,笔者要强调的是:近指针、远指针、巨指针是段寻址的16bit 处理器的产物(如果处理器是16 位
的,但是不采用段寻址的话,也不存在近指针、远指针、巨指针的概念),当前普通PC 所使用的32bit 处理
器(80386 以上)一般运行在保护模式下的,指针都是32 位的,可平滑地址,已经不分远、近指针了。但是
在嵌入式系统领域下,8086 的处理器仍然有比较广泛的市场,如AMD 公司的AM186ED、AM186ER 等处理
器,开发这些系统的程序时,我们还是有必要弄清楚指针的寻址范围。
如果读者还想更透彻地理解本文讲解的内容,不妨再温习一下微机原理、8086 汇编,并参考C/C++高级编程书籍
的相关内容

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值