c語言編譯方式?
語言編譯程序將按事先選擇好的內存模式編譯組織程序。C 語言中提供了6種編譯模式,這6種模式是:微模式(Tiny),小模式(Small),中模式(Medium),緊湊模式(Compact),大模式(Large)和巨模式(Huge)。用戶可以按照自己的程序大小及需要進行選擇。
所謂小程序就是指程序只有一個程序段,大小不超過64KB,缺省的碼(函數)指針是near(近程指針)。所謂大程序就是指程序有多個程序段,每個程序段不超過64KB,但總程序量可超過64KB,缺省的碼指針是far(遠程指針)。小數據就是指數據只有一個數據段,缺省的數據指針是near。大數據就是指數據有多個數據段,缺省的數據指針是far。
C語言編譯模式—微模式(Tiny)--near指針在微模式下程序中的數據及代碼均放在同一段內,即它們不超過 64KB。在微模式下代碼段、堆棧段和數據段的段地址均相同,即CS=DS=SS=ES。
C語言編譯模式—小模式(Small)在小模式下,程序中的代碼放在64KB的代碼段內,數據放在64KB的數據段內。在小模式下,棧段、附加數據段和數據段均指向同一地址,它們合三為一,即DS=SS=ES,指針都是near,一般程序均采用小模式編譯。
C語言編譯模式—中模式(Medium)在中模式下,所有數據放在64KB的數據段內,因而數據段內使用near,代碼量可以大于64KB(允許達到1MB),因而可以在不同的代碼段內,代碼段使用(far遠程指針)。來自不同源文件的碼模塊放在不同的碼段內。
C語言編譯模式—緊湊模式(Compact)在緊湊模式下,數據量超過64KB時,可放在多個數據段中,數據段內的指針是(far)。代碼量不超過64KB,在一個段內,因而代碼段內指針為近程的(near)。但在該模式下,靜態數據仍不能超過64KB,堆用far指針來存取。代碼、靜態數據、堆棧、堆各有自己的段。堆只有遠堆,沒有近堆。
C語言編譯模式—大模式(Large)大模式下,代碼及數據均采用far指針,且都可達到1MB。靜態數據、堆棧、堆同緊湊模式,代碼同中模式。靜態數據仍跟緊湊模式一樣,不能超過64KB。
C語言編譯模式—巨模式(Huge)巨模式下,代碼段及數據段均用far指針,代碼分布在不同的代碼段內,數據也分布在不同的數據段內,它們來自不同的源程序,大堆棧只有一個。而且靜態數據大小允許超過64KB。
緊湊模式、大模式、巨模式數據區大小均允許超過64KB,即可以用數據far指針對不同數據段內的數據進行存取,它們同稱為大數據存儲模式。但有一點不同:緊湊模式和大模式按 C 的規定,其靜態數據,即如數組、結構或其他類型的數據被定義為靜態類型時,其數據量不能超過64KB,而只有巨模式才允許超過64KB。在大數據存儲模式下,堆和棧分別在不同段內,多以動態數據和局部變量的形式存放,這樣就不受64KB大小的限制,棧的增長不會影響堆的空間。
無論采用哪一種編譯模式,C源程序編譯生成的代碼和數據量都不能超過64KB,對于超過的源程序,可以視代碼或數據多少將其分解成兩個或多個程序分別編譯。大代碼量程序要選用大代碼編譯模式(中模式、大模式和巨模式),大數據量程序應選用大數據編譯模式(緊湊模式、大模式和巨模式),這樣編譯生成的.obj 文件將會帶給連接程序信息,將代碼和數據安排在不同段內。這樣生成的.exe 文件在加載時將告訴 DOS 該程序應如何裝入代碼段和數據段,如何初始化寄存器。這樣,就可確定在不同編譯模式下開辟數據區的大小,即大于64KB,或不超過64KB。
在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調用方式,調用時只需要一個16bits的近地址,即當前CS的段內偏移。