2013-09-27 44 views

回答

4

據我所知,GCC不支持生成16位x86代碼。對於傳統的引導加載程序和類似的目的,您應該用匯編語言編寫一個小存根,以便將cpu置於32位模式並將執行傳遞給32位代碼。爲了其他目的,你真的不應該寫16位代碼。

+0

請您解釋一下。什麼關於-m16選項? –

2

GCC不生成8086代碼。 GNU AS指令.code16gcc可用於彙編GCC的輸出以16位模式運行,將asm(".code16gcc")放在C源代碼的起始處,程序將被限制爲64K字節。

+0

記錄在:https://sourceware.org/binutils/docs/as/i386_002d16bit.html#i386_002d16bit –

+2

使用.code16gcc(我仍然不確定可以稱之爲穩定功能)將產生代碼運行在16位實模式,但是它使用僅在386+上可用的指令前綴。這意味着如果您的目標是8086/8088(真實硬件或仿真器),那麼代碼可能無法正常工作。如果你打算引導進入32位保護模式,那麼編寫一個小的16位彙編程序存根,將所有東西置起來,進入保護模式,然後調用32位「C」函數,這是程序的開始。 –

+0

您當然可以使用__asm__指令將GCC中的16位彙編程序作爲內聯彙編代碼。 –

6

GCC 5.2.0(以及可能的更早版本)支持使用-m16標誌生成16位代碼。但是,代碼幾乎肯定會依賴32位處理器功能(例如32位寬寄存器),所以您應該仔細檢查生成的程序集。

man網頁:

的-m16選項是相同-m32,除了它在輸出組件的 開始,使得輸出 「.code16gcc」組件指令二進制可以運行在16位模式下。

相關問題