發表文章

目前顯示的是 8月, 2020的文章

丹語錄(二):有不有錢那是世俗,富不富足才是生活

 

組合語言使用SDCC進行組譯

圖片
先前提過SDCC全稱Small Device C Compiler,為一套微處理器或微控制器的編譯工具,支援多種架構,例如MCS-51 (8051)、PIC16、STM8、Z80等。 https://danchouzhou.blogspot.com/2018/06/sdccn76e003-1t-8051.html https://github.com/danchouzhou/N76E003-SDCC https://github.com/danchouzhou/MS51BSP_SDCC 基本上如果我們用C語言撰寫8051的程式,從C語言(source code, .c檔)一直到燒錄進晶片的執行檔(binary)通常要經過以下幾個步驟: 1. 編譯(Compile): 透過編譯器將C語言編譯成 帶有標籤 組合語言 2. 組譯(Assemble): 透過組譯器將 帶有旗標符號 組合語言組譯成 帶有 標籤 機器碼(物件檔) 3. 鏈結(Link): 透過鏈結器將 一份或多份機器碼 合成為一份執行檔 由於一份有點規模且管理良好的微控制器韌體專案,也許會把各功能或者函式庫拆成獨立一份source code,編譯時會把每一份source code透過編譯器編成組合語言,再透過組譯器組譯成機器碼,並且會在各函式的機器碼加上一些標籤或符號。最後在鏈結時,鏈結器會把主程式、函式根據目標微控制器(target)合理的安排在程式記憶體裡面,當主程式呼叫函式時就會讓CPU去執行函式的機器碼,所以組譯完的機器碼要加上標籤或符號的目的就是讓鏈結器知道函式在哪裡。 綜合來說,如果從C語言到機器碼,編譯、組譯、鏈結這三個步驟其實是密不可分的,編譯器必須編譯出組譯器認得的標籤與符號的組合語言,組譯器要組譯出鏈結器認得的標籤與符號的機器碼,鏈結器要能認得這些標籤與符號根據target合成一份執行檔。因此如今的compiler已經會是"一套工具",包含編譯器、組譯器、鏈結器。 如果要徹底了解微控制器運作的方式,最好的方式還是試試一些簡單的組合語言程式。這幾天也因為教學目的開始研究看看怎麼使用SDCC帶有的組譯器。根據SDCC的手冊章節2.9 Components of SDCC, sdas8051與sdld分別是assembler與linker http