3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
在16位x86分段存儲(chǔ)器體系結(jié)構(gòu)上,使用四個(gè)寄存器來引用各個(gè)段:
DS→數(shù)據(jù)段
CS→代碼段
SS→堆棧段
ES→額外細(xì)分
在此體系結(jié)構(gòu)上寫了一個(gè)邏輯地址segment:offset
?,F(xiàn)在回答這個(gè)問題:
近指針指向(作為偏移量)當(dāng)前段。
遠(yuǎn)指針使用段信息和偏移量來跨段指向。因此,要使用它們,必須將DS或CS更改為指定值,將取消對(duì)內(nèi)存的引用,然后恢復(fù)DS / CS的原始值。請(qǐng)注意,對(duì)它們的指針?biāo)阈g(shù)運(yùn)算不會(huì)修改指針的段部分,因此,溢出偏移量只會(huì)將其環(huán)繞。
然后是巨大的指針,這些指針被規(guī)范化為具有給定地址的最大分段(與far指針相反)。
在32位和64位體系結(jié)構(gòu)上,內(nèi)存模型使用的段不同,或者根本不使用。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
由于沒有人提到DOS,所以讓我們忘記舊的DOS PC計(jì)算機(jī),并從一般的角度來看它。然后,非常簡(jiǎn)化,它是這樣的:
任何CPU都有數(shù)據(jù)總線,這是CPU可以在一條指令中處理的最大數(shù)據(jù)量,即等于其寄存器的大小。數(shù)據(jù)總線寬度以位表示:8位或16位或64位等。這是術(shù)語“ 64位CPU”的來源-它表示數(shù)據(jù)總線。
任何CPU都有地址總線,也具有以位表示的特定總線寬度。CPU可以直接訪問的計(jì)算機(jī)中的任何存儲(chǔ)單元都具有唯一地址。地址總線足夠大,可以覆蓋您擁有的所有可尋址內(nèi)存。
例如,如果計(jì)算機(jī)具有65536字節(jié)的可尋址內(nèi)存,則可以使用16位地址總線2 ^ 16 = 65536覆蓋這些內(nèi)容。
通常,但并非總是如此,數(shù)據(jù)總線寬度與地址總線寬度一樣寬。如果它們的大小相同,那就太好了,因?yàn)檫@樣可以使CPU指令集和為其編寫的程序更加清晰。如果CPU需要計(jì)算地址,則該地址要足夠小以適合CPU寄存器(當(dāng)涉及到地址時(shí)通常稱為索引寄存器)可以方便使用。
非標(biāo)準(zhǔn)關(guān)鍵字far
和near
用于在需要尋址超出常規(guī)CPU地址總線寬度的內(nèi)存的系統(tǒng)上描述指針。
例如,具有16位數(shù)據(jù)總線的CPU也具有16位地址總線可能會(huì)很方便。但是同一臺(tái)計(jì)算機(jī)可能還需要超過2 ^ 16 = 65536字節(jié)= 64kB的可尋址內(nèi)存。
然后,CPU通常會(huì)有特殊的指令(速度稍慢),這使它可以處理超過64kb的內(nèi)存。例如,CPU可以將其大內(nèi)存劃分為多個(gè)n
頁(yè)面(有時(shí)也稱為存儲(chǔ)體,段和其他此類術(shù)語,這可能意味著一個(gè)CPU與另一個(gè)CPU的含義不同),其中每個(gè)頁(yè)面為64kB。然后,它將有一個(gè)“頁(yè)面”寄存器,在尋址該擴(kuò)展存儲(chǔ)器之前,必須首先對(duì)其進(jìn)行設(shè)置。同樣,從擴(kuò)展內(nèi)存中的子例程調(diào)用/返回時(shí),它將具有特殊的指令。
為了使C編譯器在處理此類擴(kuò)展內(nèi)存時(shí)生成正確的CPU指令,發(fā)明了非標(biāo)準(zhǔn)near
和far
關(guān)鍵字。非標(biāo)準(zhǔn)不是C標(biāo)準(zhǔn)指定的,但是它們實(shí)際上是行業(yè)標(biāo)準(zhǔn),幾乎每個(gè)編譯器都以某種方式支持它們。
far
指位于擴(kuò)展存儲(chǔ)器中的存儲(chǔ)器,超出了地址總線的寬度。由于它引用地址,因此在聲明指針時(shí)經(jīng)常使用它。例如:int * far x;
意思是“給我一個(gè)指向擴(kuò)展內(nèi)存的指針”。然后,編譯器將知道應(yīng)該生成訪問此類內(nèi)存所需的特殊指令。同樣,使用的函數(shù)指針far
將生成特殊指令以跳轉(zhuǎn)到擴(kuò)展內(nèi)存或從擴(kuò)展內(nèi)存返回。如果不使用far
,則會(huì)得到一個(gè)指向普通可尋址內(nèi)存的指針,并且最終會(huì)指向完全不同的東西。
near
主要是為了與...保持一致far
; 它引用可尋址內(nèi)存中的任何內(nèi)容,等同于常規(guī)指針。因此,它主要是一個(gè)無用的關(guān)鍵字,除了在極少數(shù)情況下要確保將代碼放置在標(biāo)準(zhǔn)可尋址內(nèi)存中之外。然后,您可以將某些內(nèi)容明確標(biāo)記為near
。最典型的情況是在底層硬件編程中編寫中斷服務(wù)程序。硬件從固定寬度的中斷向量調(diào)用它們,該寬度與地址總線寬度相同。這意味著中斷服務(wù)程序必須位于標(biāo)準(zhǔn)可尋址存儲(chǔ)器中。
最有名的使用far
和near
也許是提到的老MS-DOS的PC,這是目前被視為比較古老,因此溫和的興趣。
但是這些關(guān)鍵字也存在于更現(xiàn)代的CPU上!最值得注意的是在嵌入式系統(tǒng)中,市場(chǎng)上幾乎每個(gè)8位和16位微控制器系列都存在這種嵌入式系統(tǒng),因?yàn)檫@些微控制器通常具有16位的地址總線寬度,但有時(shí)超過64kB內(nèi)存。
每當(dāng)您有一個(gè)需要尋址地址總線寬度以外的內(nèi)存的CPU時(shí),便需要far
和near
。通常,這種解決方案不受歡迎,因?yàn)閷?duì)其進(jìn)行編程非常麻煩,并且始終考慮擴(kuò)展內(nèi)存。
推動(dòng)開發(fā)64位PC的主要原因之一實(shí)際上是32位PC的內(nèi)存使用量開始達(dá)到地址總線極限:它們只能尋址4GB的RAM。2 ^ 32 = 42.9十億字節(jié)= 4GB 為了能夠使用更多的RAM,然后選擇使用某些麻煩的擴(kuò)展內(nèi)存解決方案(例如在DOS時(shí)代),或者將計(jì)算機(jī)(包括其地址總線)擴(kuò)展到64位。

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
指針基本上保存地址。眾所周知,英特爾內(nèi)存管理分為四個(gè)部分。因此,當(dāng)指針指向的地址在同一段內(nèi)時(shí),它就是近指針,因此它僅需要2個(gè)字節(jié)的偏移量。另一方面,當(dāng)指針指向該段之外的地址(即在另一個(gè)段中)時(shí),該指針就是一個(gè)遠(yuǎn)指針。它由4個(gè)字節(jié)組成:兩個(gè)用于段,兩個(gè)用于偏移量。
- 3 回答
- 0 關(guān)注
- 609 瀏覽
添加回答
舉報(bào)