- 論壇徽章:
- 0
|
請問差別在何處
pmerofc 發(fā)表于 2010-10-19 07:38 ![]()
TC是16位程序,生成代碼也是16位代碼。有6中模式tiny,small,medium,compact, larger,huge,3種地址關鍵字far、near、huge。
以下是抄來的。
在tiny、small模式下,所有的函數定義、全局變量定義和指針變量的定義,如果沒有顯示的加上far、near、huge等關鍵字,都默認為使用了near關鍵字;
在medium模式下,函數定義默認使用了far關鍵字,變量定義默認使用了near關鍵字;
在compact模式下函數定義模式使用了near關鍵字,變量定義默認使用了far關鍵字;
在large模式下函數定義和變量定義模認使用了far關鍵字;
在huge模式下函數定義模認使用了far關鍵字,變量定義默認使用了huge關鍵字。
near、far、huge關鍵字的真正含義是什么?這三個關鍵字只能用于修飾函數、全局變量和指針變量,對于非指針類型的局部變量,這些關鍵字沒有實際意義。
當這三個關鍵字用于修飾函數時,huge的含義與far相同,用于指明該函數的調用方式為far調用方式,即調用時需要一個段值和一個段偏移組成的32bits調用地址,使用far
call進行跳轉,跳轉前先壓棧保存當前CS:IP。near修飾函數時,用于指明該函數的調用方式為near調用方式,調用時先壓棧保存當前IP,需要一個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指針尋址更大的內存空間。
對于局部變量,由于是創(chuàng)建在堆棧上,所以near、far等關鍵字將不具備任何意義,因為創(chuàng)建在堆棧上的變量的尋址方式就只有一種,即使用sp和bp維護函數堆棧,利用
bp+/-一個偏移來尋址函數參數變量和局部變量。這樣的尋址方式是固定而唯一的,near和far等關鍵字都派不上用場,這里的near和far將沒有任何的實際含義。
對于使用near、far和huge修飾的全局變量的含義也很容易理解了。near型的全局變量,被分配到了當前的數據段上,尋址這個變量只需要一個16bits的偏移量,而far型全
局變量在尋址時,需要給出段值和偏移量。huge型數組可以使用大于64K的內存空間。
far、near、huge型指針變量之間的相互轉換,從小尺寸的指針到大尺寸的指針將進行自動的類型轉換,轉換方式為加上當前的DS形成32bits的指針。從大尺寸的指針到小尺
寸的指針需要進行強制類型轉換,轉換的結果為只保留低16bits,但是這樣俄轉換沒有實際的意義或者說用處不大,并且極其容易引入內存訪問的錯誤,所以要嚴格避免使用。 |
|