- 1、本文档共2页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
CC中的近指令、远指针和巨指针
C/C++中的近指令、远指针和巨指针
?宋宝华21cnbao@21在我们的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位指针,它表示段地址:偏移地址,远指针可以进行跨段寻址,可以访问整个内存的地址。如定义远程指针p指向0x1000段的0x2号地址,即1000:0002,则可写作:
char far *p;
p=(char far *)0
除了远指针和近指针外,还有一个巨指针的概念。
和远指针一样,巨指针也是32位的指针,指针也表示为16位段:16位偏移,也可以寻址任何地址。它和远指针的区别在于进行了规格化处理。远指针没有规格化,可能存在两个远指针实际指向同一个物理地址,但是它们的段地址和偏移地址不一样,如23B0:0004和23A1:00F4都指向同一个物理地址23604!巨指针通过特定的例程保证:每次操作完成后其偏移量均小于10h,即只有最低4位有数值,其余数值都被进位到段地址上去了,这样就可以避免Far指针在64K边界时出乎意料的回绕的行为。当然,一次操作必须小于64K。下面的函数可以将远指针转换为巨指针:
void normalize(void far ** p)
{
*p=(void far *)(((long)*p0xffff000f)+(((long)*p0x0000fff0012));
}
从上面的函数中我们再一次看到了指针之指针的使用,这个函数要修改指针的值,因此必须传给它的指针的指针作为参数。
讲到这里,笔者要强调的是:近指针、远指针、巨指针是段寻址的16bit处理器的产物(如果处理器是16位的,但是不采用段寻址的话,也不存在近指针、远指针、巨指针的概念),当前普通PC所使用的32bit处理器(80386以上)一般运行在保护模式下的,指针都是32位的,可平滑地址,已经不分远、近指针了。但是在嵌入式系统领域下,8086的处理器仍然有比较广泛的市场,如AMD公司的AM186ED、AM186ER等处理器,开发这些系统的程序时,我们还是有必要弄清楚指针的寻址范围。
如果读者还想更透彻地理解本文讲解的内容,不妨再温习一下微机原理、8086汇编,并参考C/C++高级编程书籍的相关内容。
您可能关注的文档
- (人教版)二年级音乐教案 上册牧童谣1.doc
- (同课异构)画家和牧童.doc
- (沪教版)探究活动包一年级上-活动2-奇妙的手指画.doc
- 00-指针.ppt
- 00填写办法:工业动火.doc
- 011指针.doc
- 02 石材常识.doc
- 02 启事.ppt
- 06《我爱我‘家’》.ppt
- 08XX专柜满送活动草案.doc
- 2024年云南曲靖市卫生健康委员会所属事业单位招聘146人历年【高频考点汇总500题】模拟卷及参考答案详解.docx
- 2024年云南文山麻栗坡县第二次事业单位紧缺人才招聘13人【高频考点汇总500题】模拟卷及参考答案详解.docx
- 2024年云南昆明高新区事业单位公开招聘工作人员6人历年【高频考点汇总500题】模拟卷及参考答案详解.docx
- 2024年云南省昆明市呈贡区事业单位选调58人历年【高频考点汇总500题】模拟卷及参考答案详解.docx
- 2024年云南省昆明市委党校招聘6人历年【高频考点汇总500题】模拟卷及参考答案详解.docx
- 2024年云南省交通运输厅所属事业单位招聘58人聘用【高频考点汇总500题】模拟卷及参考答案详解.docx
- 2024年云南省昆明市扶贫办直属事业单位招聘1人历年【高频考点汇总500题】模拟卷及参考答案详解.docx
- 2024年云南省普洱市孟连县公证处紧缺人才招聘2人历年【高频考点汇总500题】模拟卷及参考答案详解.docx
- 2024年云南省昆明科技进修学院招聘1人历年【高频考点汇总500题】模拟卷及参考答案详解.docx
- 2024年云南省曲靖陆良县融媒体中心招聘4人(含招聘)【高频考点汇总500题】模拟卷及参考答案详解.docx
文档评论(0)