我正在編寫實模式函數,它應該是帶有堆棧幀的正常函數等,但它應該使用%sp而不是%esp。有沒有辦法做到這一點?如何告訴GCC爲實模式生成16位代碼
回答
據我所知,GCC不支持生成16位x86代碼。對於傳統的引導加載程序和類似的目的,您應該用匯編語言編寫一個小存根,以便將cpu置於32位模式並將執行傳遞給32位代碼。爲了其他目的,你真的不應該寫16位代碼。
請您解釋一下。什麼關於-m16選項? –
GCC不生成8086代碼。 GNU AS指令.code16gcc
可用於彙編GCC的輸出以16位模式運行,將asm(".code16gcc")
放在C源代碼的起始處,程序將被限制爲64K字節。
記錄在:https://sourceware.org/binutils/docs/as/i386_002d16bit.html#i386_002d16bit –
使用.code16gcc(我仍然不確定可以稱之爲穩定功能)將產生代碼運行在16位實模式,但是它使用僅在386+上可用的指令前綴。這意味着如果您的目標是8086/8088(真實硬件或仿真器),那麼代碼可能無法正常工作。如果你打算引導進入32位保護模式,那麼編寫一個小的16位彙編程序存根,將所有東西置起來,進入保護模式,然後調用32位「C」函數,這是程序的開始。 –
您當然可以使用__asm__指令將GCC中的16位彙編程序作爲內聯彙編代碼。 –
GCC 5.2.0(以及可能的更早版本)支持使用-m16
標誌生成16位代碼。但是,代碼幾乎肯定會依賴32位處理器功能(例如32位寬寄存器),所以您應該仔細檢查生成的程序集。
從man
網頁:
的-m16選項是相同-m32,除了它在輸出組件的 開始,使得輸出 「.code16gcc」組件指令二進制可以運行在16位模式下。
- 1. 用GCC編譯的16位C代碼
- 2. gcc在sparc上生成32位代碼
- 3. 如何告訴perl執行一段生成的Perl代碼?
- 4. 請告訴我不對這個實模式代碼
- 5. 如何告訴CXF wsdl2Java爲特定版本的XMLBean生成java代碼
- 6. 手臂拇指模式代碼生成 - gcc arm linux編譯器
- 7. 告訴Qmake如何生成Makefile?
- 8. 如何爲gcc編寫自己的代碼生成器後端?
- 9. 如何告訴GCC編譯器應該生成的代碼是串行的,即沒有跳轉
- 10. 告訴wsdl2java不要生成代碼,如果文件自上次代碼生成後未修改
- 11. 代碼生成wreorder警告
- 12. 如何告訴Maven編譯自動生成的maven模塊?
- 13. 如何告訴gcc使用glibc的特定實例?
- 14. 生成實例化代碼模型
- 15. 代碼分析生成的代碼生成文件 - 如何抑制警告?
- 16. 代碼合同。如何抑制生成的代碼警告?
- 17. 誰能告訴我爲什麼下面的代碼生成空指針異常?
- 18. 請告訴我代碼(//-\\.*)
- 19. 誰能告訴我爲什麼我的代碼產生錯誤?
- 20. 如何在編譯時告訴Jade保持代碼格式
- 21. 代碼生成形式Uml建模
- 22. Repository模式,EF4代碼生成
- 23. 代碼生成 - 設計模式
- 24. 如何更改代碼。 16位CLA(carry-look.ahead加法器)verilog代碼模擬
- 25. 如何使用代碼生成實體模型?
- 26. 如何更改gcc生成的asm代碼的入口點?
- 27. 如何讓gcc(或llvm)從OSX命令行生成ARM代碼?
- 28. 如何使用gcc在Intel語法中生成彙編代碼?
- 29. 位碼WatchOS3 - 如何生成
- 30. 如何生成LLVM位碼
什麼操作系統是應該運行? GCC不支持MS-DOS。 –