這篇文章以最簡單的 Win32 組合語言程式「Hello World」為例,完整記錄了從原始碼撰寫、編譯連結、執行到深入分析 API 呼叫慣例、參數傳遞、INVOKE 指令優勢、標準標頭檔使用等進階主題。是 MASM32 入門者的經典教學資料。
.code
start:
push MB_OK
lea eax,szCaption
push eax
lea eax,szText
push eax
push NULL
call MessageBoxA
xor eax,eax
push eax
call ExitProcess
end start
szText db "Hello, world!",0
szCaption db "Win32Asm",0
直接使用 CALL 呼叫 API,參數由右至左壓入堆疊 (stdcall 慣例),呼叫者清理堆疊 (但 stdcall 由被呼叫者清理,此處 RET n 隱含)。
ml /c /coff 3.asm ; 僅編譯產生 3.obj (COFF 格式)
link /subsystem:windows /libpath:d:\masm32\lib 3.obj ; 連結產生 3.exe
/c:不連結/coff:產生 COFF 目標檔 (Win32 標準)/subsystem:windows:GUI 子系統 (無主控台視窗)/libpath:指定匯入庫路徑 (kernel32.lib, user32.lib)set include=d:\masm32\include
set lib=d:\masm32\lib
ml /coff 3.asm /link /subsystem:windows
設定 INCLUDE、LIB 環境變數後,ML 可直接呼叫連結器,單行完成編譯連結。
ExitProcess PROTO :DWORD
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
PROTO 定義參數個數與類型 (均為 DWORD),供 INVOKE 檢查使用。
.model flat,stdcall
RET n),呼叫者無需 ADD ESP, nint MessageBox(
HWND hWnd, ; NULL = 無擁有者視窗
LPCTSTR lpText, ; 訊息字串位址
LPCTSTR lpCaption,; 標題字串位址
UINT uType ; MB_OK = 0
)
組合語言對應:
push MB_OK ; uType (右most)
push offset szCaption ; lpCaption
push offset szText ; lpText
push NULL ; hWnd (左most)
call MessageBoxA
invoke MessageBoxA, NULL, addr szText, addr szCaption, MB_OK
優點:
ADDR (取位址) 與立即值include d:\masm32\include\windows.inc
include d:\masm32\include\user32.inc
include d:\masm32\include\kernel32.inc
includelib d:\masm32\lib\user32.lib
includelib d:\masm32\lib\kernel32.lib
windows.inc:數萬個常數、結構、巨集定義 (需 option casemap:none 區分大小寫)user32.inc/kernel32.inc:API 函數原型 (PROTO)includelib:嵌入匯入庫路徑,連結時自動搜尋.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
szText db "Hello, world!",0
szCaption db "Win32Asm",0
.code
start:
invoke MessageBoxA, NULL, addr szText, addr szCaption, MB_OK
invoke ExitProcess, 0
end start
從手動 PUSH/CALL 到 INVOKE、從硬編碼庫路徑到環境變數/標頭檔管理,這篇文章記錄了 Win32 組合語言開發從原始到成熟的演進軌跡。掌握 .model flat,stdcall、PROTO/INVOKE、標準標頭檔體系,是撰寫可維護、可攜遷 Win32 組合語言程式的基石。MASM32 提供的豐富庫與工具鏈,讓組合語言在 Windows 平台依然保有開發效率與效能優勢。