程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C語言中的far關鍵字,C語言far關鍵字

C語言中的far關鍵字,C語言far關鍵字

編輯:C++入門知識

C語言中的far關鍵字,C語言far關鍵字


最近看嵌入式文件系統TFFS的源碼,看到far關鍵字,基礎不好,驚呆了。。。

/*Specify here which pointers may be far, if any.

 *Far pointers are usually relevant only to 80x86 architectures.

 */

下面是網上盜來的說法,大致上了解一下:

far即為遠地址,16位模式下(如80x86系列)內存是分段尋址的; (一個段就是 2^16,即64k)
指定void   far   fun1();的話,是說函數fun1的入口點在其它段中,調用時將用到段地址; 
如果指定為near的話,入口點將在本段之內,調用時值使用段內的偏移地址。 

32位中采用線性的平坦尋址方式,這一概念已被拋棄了,內存中地址統一為32位寬,大體 
說來就是這樣,細節參見相關資料

 

near、far、huge關鍵字的真正含義是什麼?

這三個關鍵字只能用於修飾函數、全局變量和指針變量,對於非指針類型的局部變量,這些關鍵字沒有實際意義。

這些關鍵字用於修飾函數時,huge的含義與far相同,用於指明該函數的調用方式為far調用方式,即調用時需要一個段值和一個段偏移組成的32bits調用地址,使用far call進行跳轉,跳轉前先壓棧保存當前CS:IP。near修飾函數時,用於指明該函數的調用方式為near調用方式,調用時只需要一個16bits的近地址,即當前CS的段內偏移。
當這三個關鍵字用於修飾指針時,near型指針實質上為16bits的無符號整型數,該整數給出了所指向變量在當前數據段內的偏移地址,也就是說,在使用near型指針尋址時實際上是進行如下的尋址操作:[DS:指針變量值]。對於far型的指針變量,可以尋址1MB地址空間的任意一個地方,far型指針的實質是一個32bits的整型數,高16bits為段值,低16bits為段內偏移,Turbo C中在使用far型指針時,會先將高16bits放入ES寄存器中,然後再進行如下的尋址操作:[ES:指針變量低16bits值]。對於hug型的指針變量,與far性指針變量的不同之處在於,在對far型指針變量進行+/++/-/--等操作時,far型指針變量保持段值不變(也就是高16bits),而只對段內偏移進行加減操作,所以會出現段內回繞的現象,而huge型的指針,在進行加減操作時將會自動的改變段值,不會出現段內回繞。所以給人的感覺就是huge指針能比far指針尋址更大的內存空間。

 

 C/C++中nearfar的區別

      關鍵字nearfar受目標計算機體系結構的影響。目前編程中使用不多。

      near關鍵字創建一個指向可尋址內存低端部分的目標指針。這些指針占用內存的單一字節,並且他們能夠指向的內存單元被限制到256個位置,通常是在0x0000~0x00ff范圍中。

      int near * ptr;

      far關鍵字創建一個能夠指向內存中任何數據的指針:

      char far * ptr;

  near   (近)指針:16位段內偏移地址     
  far(遠)指針:16位段地址+16位段內偏移地址     
  huge(巨)指針:32位規格化的具有唯一性的內存地址   
  C語言的存貯屬性由六種編譯模式決定(參見TC集成環境菜單中的option->compiler->model選項),默認的編譯模式為small,   在該編譯模式下,指針的默認屬性為near

補充:near指針是16位指針,依賴一個段地址寄存器,指針變量就是位移量,利用 段地址寄存器+指針 來尋址,所以有64K之限制。
         far 指針是32位指針,不但有16位的位移量,還有16位的段地址,但此指針有個缺陷,增量時只加到位移部分,一旦16位的位移量超過了FFFF就會回到這個段地址的初始。
         所以,又引入了huge指針,huge指針與far一樣,其區別僅在於使用了標准化的方法來表示,這樣所有的地址都有一個唯一的表示方法,從而避免了far指針的問題。
         空指針規定了一種指針狀態,如果沒有這個空指針,就如數字沒有了0。     

 

C/C++中nearfar的區別 關鍵字nearfar受目標計算機體系結構的影響。目前編程中使用不多。 near關鍵字創建一個指向可尋址內存低端部分的目標指針。這些指針占用內存的單一字節,並且他們能夠指向的內存單元被限制到256個位置,通常是在0x0000~0x00ff范圍中。 int near * ptr; far關鍵字創建一個能夠指向內存中任何數據的指針: char far * ptr; near (近)指針:16位段內偏移地址 far(遠)指針:16位段地址+16位段內偏移地址 huge(巨)指針:32位規格化的具有唯一性的內存地址 C語言的存貯屬性由六種編譯模式決定(參見TC集成環境菜單中的option->compiler->model選項),默認的編譯模式為small, 在該編譯模式下,指針的默認屬性為near。 補充:near指針是16位指針,依賴一個段地址寄存器,指針變量就是位移量,利用 段地址寄存器+指針 來尋址,所以有64K之限制。 far 指針是32位指針,不但有16位的位移量,還有16位的段地址,但此指針有個缺陷,增量時只加到位移部分,一旦16位的位移量超過了FFFF就會回到這個段地址的初始。 所以,又引入了huge指針,huge指針與far一樣,其區別僅在於使用了標准化的方法來表示,這樣所有的地址都有一個唯一的表示方法,從而避免了far指針的問題。 空指針規定了一種指針狀態,如果沒有這個空指針,就如數字沒有了0。   轉自:http://www.cnblogs.com/SFAN/archive/2011/08/06/2129577.html  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved