• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0
            在我們的C/C++學(xué)習(xí)生涯中、在我們大腦的印象里,通常只有指針的概念,很少聽(tīng)說(shuō)指針還有遠(yuǎn)、近、巨之分的,從沒(méi)聽(tīng)說(shuō)過(guò)什么近指針、遠(yuǎn)指針和巨指針。
            可以,某年某月的某一天,你突然看到這樣的語(yǔ)句:
            char near *p; /*定義一個(gè)字符型“近”指針*/
            char far *p; /*定義一個(gè)字符型“遠(yuǎn)”指針*/
            char huge *p; /*定義一個(gè)字符型“巨”指針*/
            實(shí)在不知道語(yǔ)句中的“near”、“far”、“huge”是從哪里冒出來(lái)的,是個(gè)什么概念!本文試圖對(duì)此進(jìn)行解答,解除許多人的困惑。
            這一點(diǎn)首先要從8086處理器體系結(jié)構(gòu)和匯編淵源講起。大家知道,8086是一個(gè)16位處理器,它設(shè)定了四個(gè)段寄存器,專門用來(lái)保存段地址:CS(Code Segment):代碼段寄存器;DS(Data Segment):數(shù)據(jù)段寄存器;SS(Stack Segment):堆棧段寄存器;ES(Extra Segment):附加段寄存器。8086采用段式訪問(wèn),訪問(wèn)本段(64K范圍內(nèi))的數(shù)據(jù)或指令時(shí),不需要變更段地址(意味著段地址寄存器不需修改),而訪問(wèn)本段范圍以外的數(shù)據(jù)或指令時(shí),則需要變更段地址(意味著段地址寄存器需要修改)。
            因此,在16位處理器環(huán)境下,如果訪問(wèn)本段內(nèi)地址的值,用一個(gè)16位的指針(表示段內(nèi)偏移)就可以訪問(wèn)到;而要訪問(wèn)本段以外地址的值,則需要用16位的段內(nèi)偏移+16位的段地址,總共32位的指針。
            這樣,我們就知道了遠(yuǎn)、近指針的區(qū)別:
            &Oslash; 近指針是只能訪問(wèn)本段、只包含本段偏移的、位寬為16位的指針;
            &Oslash; 遠(yuǎn)指針是能訪問(wèn)非本段、包含段偏移和段地址的、位寬為32位的指針。
            近指針只能對(duì)64k字節(jié)數(shù)據(jù)段內(nèi)的地址進(jìn)行存取,如:
            char near *p;
            p=(char near *)0xffff;
            遠(yuǎn)指針是32位指針,它表示段地址:偏移地址,遠(yuǎn)指針可以進(jìn)行跨段尋址,可以訪問(wèn)整個(gè)內(nèi)存的地址。如定義遠(yuǎn)程指針p指向0x1000段的0x2號(hào)地址,即1000:0002,則可寫(xiě)作:
            char far *p;
            p=(char far *)0x10000002;
            除了遠(yuǎn)指針和近指針外,還有一個(gè)巨指針的概念。
            和遠(yuǎn)指針一樣,巨指針也是32位的指針,指針也表示為16位段:16位偏移,也可以尋址任何地址。它和遠(yuǎn)指針的區(qū)別在于進(jìn)行了規(guī)格化處理。遠(yuǎn)指針沒(méi)有規(guī)格化,可能存在兩個(gè)遠(yuǎn)指針實(shí)際指向同一個(gè)物理地址,但是它們的段地址和偏移地址不一樣,如23B0:0004和23A1:00F4都指向同一個(gè)物理地址23604!巨指針通過(guò)特定的例程保證:每次操作完成后其偏移量均小于10h,即只有最低4位有數(shù)值,其余數(shù)值都被進(jìn)位到段地址上去了,這樣就可以避免Far指針在64K邊界時(shí)出乎意料的回繞的行為。當(dāng)然,一次操作必須小于64K。下面的函數(shù)可以將遠(yuǎn)指針轉(zhuǎn)換為巨指針:
            void normalize(void far ** p)
            {
              *p=(void far *)(((long)*p&0xffff000f)+(((long)*p&0x0000fff00<<12));
            }
            從上面的函數(shù)中我們?cè)僖淮慰吹搅酥羔樦羔樀氖褂茫@個(gè)函數(shù)要修改指針的值,因此必須傳給它的指針的指針作為參數(shù)。
            講到這里,筆者要強(qiáng)調(diào)的是:近指針、遠(yuǎn)指針、巨指針是段尋址的16bit處理器的產(chǎn)物(如果處理器是16位的,但是不采用段尋址的話,也不存在近指針、遠(yuǎn)指針、巨指針的概念),當(dāng)前普通PC所使用的32bit處理器(80386以上)一般運(yùn)行在保護(hù)模式下的,指針都是32位的,可平滑地址,已經(jīng)不分遠(yuǎn)、近指針了。但是在嵌入式系統(tǒng)領(lǐng)域下,8086的處理器仍然有比較廣泛的市場(chǎng),如AMD公司的AM186ED、AM186ER等處理器,開(kāi)發(fā)這些系統(tǒng)的程序時(shí),我們還是有必要弄清楚指針的尋址范圍。
            如果讀者還想更透徹地理解本文講解的內(nèi)容,不妨再溫習(xí)一下微機(jī)原理、8086匯編,并參考C/C++高級(jí)編程書(shū)籍的相關(guān)內(nèi)容。
            posted on 2008-07-23 16:27 chatler 閱讀(125) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺(jué)這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺(jué)得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            色8激情欧美成人久久综合电| 亚洲精品乱码久久久久久蜜桃图片 | 综合久久给合久久狠狠狠97色| 久久久人妻精品无码一区 | 香蕉99久久国产综合精品宅男自 | 麻豆精品久久久一区二区| 国产69精品久久久久99| 久久强奷乱码老熟女网站| 91视频国产91久久久| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲综合伊人久久大杳蕉| 久久亚洲国产欧洲精品一| 国内精品伊人久久久久妇| 久久久久久综合一区中文字幕| 久久受www免费人成_看片中文| 97久久久精品综合88久久| 思思久久99热免费精品6| 国产成人精品久久一区二区三区| 久久久久亚洲AV成人网| 久久久久久久亚洲Av无码| 亚洲婷婷国产精品电影人久久| 久久96国产精品久久久| 久久亚洲私人国产精品| 奇米影视7777久久精品人人爽| 狠狠人妻久久久久久综合蜜桃| 97久久精品无码一区二区天美| 亚洲中文字幕无码久久2017| 精品国产99久久久久久麻豆| 欧美麻豆久久久久久中文| 久久久精品久久久久特色影视| 99久久精品国产一区二区蜜芽| 久久99中文字幕久久| 99久久国产综合精品麻豆| 久久国产免费观看精品3| 97久久精品无码一区二区 | 99麻豆久久久国产精品免费| 久久亚洲精品中文字幕| 久久人妻少妇嫩草AV无码专区| 久久久精品2019免费观看| 国产精品九九九久久九九| 久久伊人精品青青草原高清|