瞭解near指針和far指針

在上一節重溫printf函數時裏面提到near和far指針,又不懂了,查資料大致知道了一點,貼出與大家共勉:


在DOS下(實模式)地址是分段的,每一段的長度爲64K字節,剛好是16位(二進制的十六位)。

near指針的長度是16位的,所以可指向的地址範圍是64K字節,通常說near指針的尋址範圍是64K。
far指針的長度是32位,含有一個16位的基地址和16位的偏移量,將基地址乘以16後再與偏移量相加,(所以實際上far指針是20位的長度。)即可得到far指針的1M字節的偏移量。所以far指針的尋址範圍是1M字節,超過了一個段64K的容量。例如一個far指針的段地址爲0x7000,偏移量爲0x1244,則該指針指向地址0x71224.如果一個far指針的段地址是0x7122,偏移量爲0x0004,則該指針也指向地址0x71224。
如果沒有指定一個指針是near或far,那麼默認是near。所以far指針要顯式指定。far指針工作起來要慢一些,因爲每次訪問一個far指針時,都要將數據段或程序段的數據交換出來。另外,far指針的運算也比較反常,例如上面講到的far指針指向同一個地址,但是比較的結果卻不相同。


那麼什麼時候使用far指針呢?
當使用小代碼或小數據存儲模式時,不能編譯一個有很多代碼或數據的程序。因爲在64K的一個段中,不能放下所有的代碼與數據。爲了解決這個問題,需要指定以far函數或far指針來使用這部分的空間(64K以外的空間)。許多庫函數就是顯式地指定爲far函數的形式。far指針通常和farmalloc()這樣的內存分配函數一起使用


而如今電腦系統早已突破16位了,32位或64位編程裏已經不再區分far和near了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章