電路

Photo by Umberto on Unsplash

最近在學習王爽的《匯編語言》(組合語言),書裡面教的內容以 16 位元的 Intel 8086 CPU 為學習平台,而教科書上使用的編譯器是微軟的 MASM,語法也是針對 MASM 的,而非開源跨平台的 NASM,所以不能直接在 Linux 編譯執行,需要用 DOSBox 模擬 DOS 環境才行,MASM 比較封閉且支援平台少,如位元的果你打算學組合語言的話建議學 NASM 語法,要不是學校要求用 MASM 我也想用 NASM 編譯。

安裝 DOSBox

DOSBox 使用 GPL 許可證發佈,各大 Linux 發行版軟體倉庫應該都有。

1
2
3
4
5
6
# Arch Linux
sudo pacman -S dosbox
# Debian and Ubuntu
sudo apt-get install dosbox
# Fedora
sudo dnf -y install dosbox

下載 MASM 程式

本來想說 Windows 目錄裡面應該有 MASM 的工具,後來的版本好像拿掉了,之後在網路上找到了並打包了一份上傳到 Google 雲端硬碟。

下載連結:百度雲(網友上傳,提取碼:3akd) | Google Drive

設定

我們要先建立一個目錄來存放我們寫的程式碼和 MASM 工具,並在 DOSBox 啟動時掛載才能使用。

1
2
3
mkdir ~/dos
mkdir ~/dos/asm # 這個目錄存放你的程式
mkdir ~/dos/masm # 這個目錄放剛才下載的 MASM 工具

然後把下載的 MASM 解壓放到 ~/dos/masm 中準備掛載。

產生設定檔

在終端機不帶參數執行 DOSBox,會自動產生設定檔。

1
$ dosbox

掛載設定

設定檔存在 ~/.dosbox/,裡面有個副檔名為 .conf 的檔案。

$ ls ~/.dosbox
dosbox-0.74-3.conf

在設定檔最後 [autoexec] 的地方寫入掛載指令,這幾行指令的作用是將 ~/dos 掛載到 DOSBox 的 D 槽,並將 masm 加入環境變數。

1
2
3
4
5
6
7
[autoexec]
# Lines in this section will be run at startup.
# You can put your MOUNT lines here.
mount d ~/dos
path=%path%;\masm
d:
cd asm

如果你找不到 DOSBox 的設定檔,直接在 DOSBox 輸入下面指令也可以。

1
2
3
4
mount d ~/dos
path=%path%;\masm
d:
cd asm

執行測試

終端裡輸入 dosbox,DOSBox 會讀取先前修改的設定檔,自動執行 [autoexec] 裡的指令,如果輸入 masm 能執行的話就可以開始編譯了,第一個會問檔名,輸入後按 Enter,剩下的問題都保持預設,直接 Enter 跳過。

masm 在 DOSBox 執行

然後 link 動態連結 obj 檔案,產生 exe 可執行檔,用法跟前面的 masm 大同小異,像這樣就會產生 sum.exe

link

dir 可以檢視當前目錄下的資料夾和檔案,和 Bash 的 ls 功能相同,如果編譯過程沒出現錯誤訊息就能看見你剛才編譯完成的 exe

dir

debug 也能正常操作,可以用這工具檢視記憶體內容,按 q 退出。

debug 顯示記憶體內容

Reference