遠指針

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

遠(far)指針

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

應該注意:

儘管遠指針可以定址記憶體中的任一單元,但它所定址
的目標也不能超過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)....

相關詞條

相關搜尋

熱門詞條

聯絡我們