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

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

            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

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产亚洲一区二区| 国产精品VIDEOSSEX久久发布| 久久久久久久综合狠狠综合| 久久久久黑人强伦姧人妻| 久久婷婷人人澡人人爽人人爱| 久久久久一级精品亚洲国产成人综合AV区| 国产亚洲美女精品久久久| 久久一区二区三区99| 欧洲精品久久久av无码电影| 久久综合久久综合久久| 亚洲а∨天堂久久精品| 久久久亚洲欧洲日产国码二区| 超级碰久久免费公开视频| 久久婷婷五月综合成人D啪| 国产精品嫩草影院久久| 久久人人爽人人爽人人片AV不| 青青热久久国产久精品| 国产精品久久久久国产A级| 思思久久精品在热线热| 久久精品嫩草影院| 精品久久久久久国产潘金莲| 2020国产成人久久精品| 久久精品成人免费观看97| 久久伊人精品青青草原高清| 亚洲?V乱码久久精品蜜桃 | 久久免费精品视频| 久久久高清免费视频| 99久久亚洲综合精品成人| 久久只有这里有精品4| 国内精品久久久久影院亚洲| 久久99精品久久久久久秒播| 久久久综合九色合综国产| 精品精品国产自在久久高清| 91久久精品91久久性色| 奇米综合四色77777久久| 亚洲精品乱码久久久久久蜜桃图片| 久久久久国产日韩精品网站| 久久精品女人天堂AV麻| 精品久久国产一区二区三区香蕉| 精品无码久久久久久久动漫| 久久精品亚洲男人的天堂|