遠指針

遠指針不是讓編譯程式把程式數據段地址作為指針的段地址部分,而是把指針的段地址與指針的偏移量直接存放在指針內。

基本介紹

  • 中文名:遠指針
  • 外文名:far pointer
  • 位數:32位的指針
  • 大小:4 個位元組構成
遠(far)指針,遠指針與近指針區別,使用遠指針的注意事項,

遠(far)指針

因此,遠指針是由4 個位元組構成。它可以指向記憶體中的任一目標,可以用於任一編譯模式,儘管僅在緊湊、大和巨模式下遠指針才是預設的數據指針。因為遠指針的段地址在指針內,熟悉80X86 彙編語言的人都知道,這意味著每次使用遠指針時都需要重新裝載段暫存器,這顯然會降低速度

遠指針與近指針區別

近指針是16位的指針,它只表示段內的偏移地址,因而只能對64k位元組數據段內地址進行存取。
如 char near *p;
p=(char near *)0xffff;
遠指針是32位指針,它表示段地址:偏移地址,如定義遠程指針p指向B500段的2號地址,即B500:0002,則可寫作:
char far *p;
p=(char far *)0xB5000002;
因此,遠指針可以進行跨段定址,可以訪問整個記憶體的地址。

使用遠指針的注意事項

儘管遠指針可以定址記憶體中的任一單元,但它所定址的目標也不能超過64K 位元組。這是因為,遠指針在增量或減量之類的算術運算時,也只是偏移量部分參與運算,而段地址保持不變。因此,當遠指針增量或減量到超過64K位元組段邊界時就出錯。例如: char far *fp=(char far *)0xb800ffff;fp++; 在指針加1以後,fp將指向B800:0000,而不是所希望的C800:0000。
此外,在進行指針比較時,far指針還會引起另外一些問題。far指針是由偏移量和段地址這樣一對16位數來表示的,對於某一實際記憶體地址,far指針不是唯一的,例如,far指針1234:0005、1230:0045、1200:0345、1000:2345、0900:9345等都是代表實際地址12345,這樣會引起許多麻煩。
第一,為了便於與“空”(NULL)指針(0000: 0000)進行比較,當
關係操作符“==”和“!=”用於對far 指針進行比較時,比較的是全
部32位。否則,如果只比較16位偏移量,那么任何偏移量為0 的指針
都將是“空”(NULL)指針,這顯然不符合一般使用要求。但在進行這
32位比較時,不是按20位實際地址來比較,而是把段地址和偏移量當
作一個32位無符號長整數來比較。對於上面這個例子,假設這些指針
分別叫作a、b、c、d、e,儘管這5個far 指針指向的都是同一記憶體單
元,但下列表達式運算的結果卻都為“假”,從而得出錯誤的結論:
if(a==b)....
if(b==c)....
if(c==d)....
if(d==e)....
if(a==c)....
if(a==d)....
第二,當用“>”、“>=”,“<”和“<=”關係操作符對指針進
行比較操作時,比較的僅僅是偏移量部分,即按無符號的16位整數進
行比較。因此,對於上面這個例子,下列表達式運算的結果將都為
“真”,也得出錯誤的結論:
if(e>d)....
if(d>c)....
if(c>b)....
if(b>a)....
if(e>a)....

相關詞條

熱門詞條

聯絡我們