在前一陣用Java寫C--(簡化的C語言)編譯器的時候,遇到了一個困擾我很久的問題:在將測試C—代碼輸入並執行完parser和typechecking之後,成功編譯生成了一段完整的MIPS代碼。然而將MIPS代碼複製進模擬器QtSpim執行時,模擬器卻報錯了。 問題分析:一開始無法直接定位出現問題的 ...
在前一陣用Java寫C--(簡化的C語言)編譯器的時候,遇到了一個困擾我很久的問題:在將測試C—代碼輸入並執行完parser和typechecking之後,成功編譯生成了一段完整的MIPS代碼。然而將MIPS代碼複製進模擬器QtSpim執行時,模擬器卻報錯了。
問題分析:一開始無法直接定位出現問題的位置,只能由QtSpim提供的錯誤信息里找到出錯的代碼位置,發現問題出在了在函數之間傳遞參數的代碼上。
Error message:Instruction references undefined symbol at 0x00400014
為了定位問題的具體類型,將輸入的C--代碼功能簡化到一個單獨的main函數,然後逐步添加全局變數、添加局部變數聲明、流程式控制制語句和函數聲明及調用,最終發現問題出在了函數的參數傳遞上。
找到出錯誤的代碼後,發現問題在於調用函數時會對參數的偏移量進行對齊,而進行對齊的代碼出了一點錯誤。將錯誤修正後,問題得以解決。