在x86程序集中編寫代碼是否有很好的參考。我正在編寫一個編譯器,目前我正處於代碼生成階段。我正在實施的語言是面向對象的。例如,現在我在編寫類聲明,對象佈局等的程序集時遇到麻煩......是否有涵蓋此主題的任何書籍或參考?在x86中進行編碼 - 編譯器代碼生成
回答
architecture reference documentation是你最好的選擇。
但是,不要指望類聲明或對象佈局有太多幫助。正在編譯的語言規範將包含一些內容,但爲類聲明生成的機器代碼與語言非常鬆散地耦合,並且主要是實現者的選擇,而不是CPU架構。
您能否更具體一些,例如是否有解釋方法減速度如何轉化爲程序集等的參考文件......這將會很棒 – 2012-03-24 22:30:39
@MikeG:方法聲明轉換爲代碼不是CPU架構問題,這是什麼這些文件是爲了。編譯器作者的工作是創建將源代碼編譯成目標代碼的代碼。由於您選擇了編寫編譯器的挑戰,我們期望您*已經*瞭解如何從源生成解析樹並將它們轉換爲針對特定體系結構的僞指令(或真實指令)。 – wallyk 2012-03-24 22:35:23
@MikeG:正如已經說過的,像鋪設堆棧框架這樣的東西;將方法調用放在堆棧上;以及如何在內存對象中佈局字段,調度表指針等,並不依賴於指令集。這只是一種方法。你應該看看龍書。 – blackcompe 2012-03-26 12:05:15
對於你的問題可以有「直接」和「有用」的答案,它們可能不兼容。
直接的答案是,您應該將架構參考(請參閱前面的答案中的鏈接)與您爲此選擇的確切彙編程序的詳細信息(例如, gas,nasm,yasm,fasm,masm [32],tasm等;他們所有的指令語法,僞指令(如分割,內存分配等),實現細節,目標文件格式...
有用的(jIMHO)答案是重複行業領導者的結果,如GNU編譯器集合,Microsoft Developer Studio等需要數千年的時間,所以這是非常奇怪的方式;相反,您應該儘可能重複使用現有的措施。例如,要驗證您的語言的概念,您可以將轉換器實現爲C代碼併爲此支持庫。或者,寫一個知名的虛擬機及其語言爲Java或C#。在高級層面上,您可以用自己的代碼(如GCC和LLVM允許)替換編譯器前端,並重新使用代碼生成後端,這些後端可以很好地編寫並針對多個目標進行調整。
我很懷疑你設計的東西不能轉換爲C並支持庫調用。中間代碼不應該很好看,它只是工作。
如果你仍然想使用手動日落,請編輯與目標平臺上更多的細節問題(在Windows/Linux的/等,16- 32位或64位......)
- 1. 如何讓Java編譯器在編譯代碼中生成行號碼
- 2. 編譯器代碼生成器驗證
- 3. 編譯時代碼生成
- 4. Haskell編譯器的代碼生成
- 5. javax.annotation.processing.AbstractProcessor:編譯器生成的代碼
- 6. Swift編譯器 - 代碼生成
- 7. 編譯器代碼生成比較
- 8. 運行時代碼生成和編譯
- 9. 衍生代碼編譯器
- 10. 英特爾奔騰彙編器x86彙編代碼生成
- 11. x86彙編代碼
- 12. jOOQ生成的代碼無法編譯?
- 13. 編譯後生成的視圖代碼
- 14. 編譯時如何生成代碼?
- 15. 編譯寓言生成代碼的WebPack
- 16. scalaxb生成的代碼導致編譯
- 17. 編譯角度ajax生成的代碼
- 18. 在D中編譯時間碼生成
- 19. 在ubuntu中編譯/編譯源代碼
- 20. 用C++編譯器編譯c代碼
- 21. 原生代碼Typescript編譯器
- 22. 生成HTML代碼JavaScript編碼在C#
- 23. 編寫代碼以幫助編譯器進行優化
- 24. 在CGAL4.6中編譯CGAL4.2中成功編譯的代碼錯誤
- 25. 在現代編譯器中編譯狡猾的Fortran 77代碼
- 26. 從C#代碼生成彙編代碼?
- 27. 彙編代碼的x86
- 28. 編譯器中是否生成三個地址代碼?
- 29. 由nvcc編譯器爲CUDA程序生成的中間代碼
- 30. 在運行時生成,編譯和使用Java代碼?
你的問題是大含糊。類聲明或對象佈局不應包含任何程序集。 – 2012-03-24 22:25:56
也許你可以閱讀[clang/llvm](http://llvm.org/)的源代碼?根據我的經驗,這很容易理解。 – 2012-03-24 22:27:07
你是什麼意思,沒有組裝涉及類聲明。如果我有一個有多種方法和領域的類,會怎麼樣?如果我不在程序集中編寫方法,那麼以後會在何時/何時聲明它們? – 2012-03-24 22:27:20