# X8051 組譯器使用說明 本篇將介紹如何將你編寫的組合語言程式(.asm),組譯成十六進制的機器碼(.hex),使其能夠燒錄至你的 8051。 **其他筆記連結:** * [單晶片系統實驗器材準備](https://hackmd.io/@zjewp/8051) * [ALL-100 燒錄器使用教學](https://hackmd.io/@zjewp/all-100) * [實驗一:計數器](https://hackmd.io/@zjewp/51e1) ## 所需軟體 * **DOSBox** -- https://www.dosbox.com/ 由於我們使用的 assembler 為 16 位元的應用程式,因此需要使用 DOSBox 模擬 16 位元的環境。 * **X8051** -- 可於課輔系統教材下載 2500 A.D. Software 出品的 MCS-51 assembler。 * **LINK** -- 可於課輔系統教材下載 2500 A.D. Software 出品的 MCS-51 linker,因本課程使用的為第四版,故教材中將其命名為 LINK4。 <span style=color:red;font-weight:bold> ! ! 你可以自行下載上述軟體,或是下載我整理的整合包 [**按此下載**](https://drive.google.com/file/d/1b5MDGoPibUyy07Vs922sZ6UPoWJzFAOj/view?usp=sharing)。 ! !</span> ## 操作步驟 ### 1. 啟動 DOSBox,並將工作目錄掛載至模擬環境。 ```console mount <欲掛載的磁碟機代號> <掛載目錄的實際路徑> ``` **範例:**```mount j c:\temp``` ```console <磁碟機代號>: ``` **範例:**```j:``` ![s01](https://hackmd.io/_uploads/rkb8TD4na.png) ### 2. 確認工作目錄下有 X8051, LINK4 及你想組譯的程式碼。 ![s02](https://hackmd.io/_uploads/BJkdxu43T.png) <details> <summary>可使用此範例程式碼測試</summary> ```plaintext= ORG 0000H CLR A LOOP: MOV P1, A INC A ACALL DELAY AJMP LOOP ; Delay routine DELAY: MOV R5, #200 ; 1 machine cycle DL0: MOV R6, #200 ; 1 cycle DL1: MOV R7, #100 ; 1 cycle DL2: DJNZ R7, DL2 ; 2 cycle DJNZ R6, DL1 ; 2 cycle DJNZ R5, DL0 ; 2 cycle RET ; 2 cycle END ``` </details> ### 3. 使用 X8051 組譯你的程式。 ```console x8051 <欲組譯之程式碼名稱>.asm ``` * 此處的附檔名「.asm」可省略,因 X8051 預設便是以「.asm」作為輸入檔的附檔名。 * 請留意組譯器是否有提示 Error 或 Warning,組譯成功後會輸出一個 obj 檔,若組譯失敗則檢查程式碼後再重新嘗試。 **範例:**```x8051 test.asm``` **or**  ```x8051 test``` ![s03](https://hackmd.io/_uploads/ryvcMOV3a.png) ### 4. 使用 LINK 鏈結你的程式。 ```console link4 -c <欲組譯之程式碼名稱>.obj ``` * 此處的附檔名「.obj」也可省略,因 LINK 預設便是以「.obj」作為輸入檔的附檔名。 * 請留意鏈結器是否有提示 Error 或 Warning,組譯成功後會輸出一個 hex 檔,若鏈結失敗則檢查程式碼後再重新嘗試。 * **另外,請注意此處的須加上「-c」這個 option。** **範例:**```link4 -c test.obj``` **or**  ```link4 -c test``` ![s04](https://hackmd.io/_uploads/Bke_D_E2T.png) ### 5. 確認 hex 檔是否已成功建立,若存在則該程式的組譯已大功告成! 完成後便可將 hex 檔放入你的隨身碟,至教室後方之燒錄器燒錄你的 8051 了。 ![HiLo_01](https://hackmd.io/_uploads/rJvjlKwh6.jpg) --- ## 額外補充 ### 為何需要使用 DOSBox 而不直接在 Windows 的命令行介面直接執行? X8051 是 16 位元的應用程式,需要在 16 位元的電腦上執行,而在 314 教室的電腦絕大多數是 64 位元,因此需要使用 DOSBox 模擬 16 位元的 MS-DOS 虛擬環境來執行 X8051。 此外,微軟在 32 位元的 Windows 上有 NTVDM (NT Virtual DOS Machine) 功能,作業系統在執行 16 位元程式時會創建一個 16 位元的虛擬機,因此在 32 位元的 Windows 上也能直接執行 16 位元的程式。 314 教室最後面的電腦是 32 位元的 Windows XP 系統,有時間可以在該電腦上直接於命令行介面執行 X8051 試試。 ## TL;DR ### 1. 使用 X8051 進行組譯 ``` x8051 filename.asm ``` ``` link4 -c filename.obj ``` ### 2. 使用 C51ASM 進行組譯 https://www.microchip.com/en-us/development-tool/c51asm C51ASM 是 Atmel 提供給 MCS-51 架構的組譯器。 它是 32 位元的應用程式,因此在 32 或 64 位元的電腦上可以直接執行,且包含了 linker ,可做到單一命令由 asm 檔輸出 hex 檔,使用起來較 X8051 方便許多。 ``` c51asm filename.asm ```