這是一份持續更新的 Win32 組合語言教學系列,著重於在 Windows 環境下撰寫組語程式,而非傳統的 DOS 中斷導向教學。內容涵蓋工具鏈建置、CPU 暫存器、記憶體模型、指令集、巨集、Windows API 呼叫慣例、訊息迴圈、視窗建立完整範例,適合想深入理解底層運作的開發者。
invoke、型別檢查),替代 TASM/NASM。link.exe)。brc32.exe 編譯資源)。win32.hlp),現建議改用 MSDN。安裝路徑建議放在同一磁碟分割,並將 MASM bin 目錄加入 PATH。
add eax, edx → 66 03 C2。.data、.data?、.const、.code 區段宣告。DB/DW/DD 定義位元組/字/雙字,支援 DUP 重複。MOV(立即數、暫存器、記憶體)、XCHG 交換。ADD/SUB/MUL/DIV、有號 IMUL/IDIV、INC/DEC。AND/OR/XOR/NOT、位移 SHL/SHR/SAL/SAR、循環 ROL/ROR/RCL/RCR。TEST(不改變運算元)、CMP 設定旗標。PUSH/POP、CALL/RET。PUSH 參數,CALL 進入程序,RET 返回並清理堆疊(STDCALL 慣例)。LOCAL var:DWORD 配置於堆疊框架,RET 時自動釋放。EAX 為主要回傳暫存器。JMP、條件 JZ/JNZ/JG/JL/JA/JB/JGE/JLE/JAE/JBE 等。JG vs JA)。.IF eax == 1
; ...
.ELSEIF ecx != 2
; ...
.ELSE
; ...
.ENDIF
.WHILE eax == 1
INC eax
.BREAK .IF eax == 7
.ENDW
.REPEAT
; ...
.UNTIL eax == 1
編譯器自動轉換為對應的 CMP/Jcc 指令,大幅提升可讀性。
INVOKE 與 PROTO 簡化 API 呼叫MessageBox PROTO STDCALL :DWORD, :DWORD, :DWORD, :DWORD
INVOKE MessageBox, NULL, ADDR szText, ADDR szTitle, MB_OK
ADDR 位址解析。MyProc PROC param1:DWORD, param2:DWORD ... MyProc ENDP。.486 / .model flat, stdcall / option casemap:none、includelib 系統庫、include 標頭檔。GetModuleHandle 取得實例控制代碼、填寫 WNDCLASSEX 結構、RegisterClassEx 註冊類別。CreateWindowEx、ShowWindow、UpdateWindow。GetMessage/TranslateMessage/DispatchMessage 循環。WM_CREATE、WM_DESTROY(呼叫 PostQuitMessage)、其他交給 DefWindowProc。.486
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
.data
MsgText db "Hello world!", 0
MsgTitle db "This is a messagebox", 0
.code
start:
invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_OK or MB_ICONINFORMATION
invoke ExitProcess, NULL
end start
@echo off
ml /c /coff first.asm
link /subsystem:windows first.obj
pause>nul
Win32 組語雖學習曲線陡峭,但能生成極小極快的執行檔,且無需額外執行階段庫。掌握 MASM 高階語法(.IF、INVOKE、LOCAL)後,開發效率大幅提升,適合效能關鍵模組、Shellcode、驅動程式開發或單純追求極致控制的專案。