首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

Win32 組合語言入門:Hello World 完整建置指南

     編輯:組合語言

前言

這篇文章以最簡單的 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 可直接呼叫連結器,單行完成編譯連結。

深入分析:API 呼叫慣例與參數傳遞

函數原型聲明

ExitProcess PROTO :DWORD
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD

PROTO 定義參數個數與類型 (均為 DWORD),供 INVOKE 檢查使用。

stdcall 呼叫慣例

.model flat,stdcall
  • flat:32 位元平坦記憶體模型,段暫存器無用
  • stdcall:參數**右至左**壓堆疊,被呼叫者負責清理堆疊 (RET n),呼叫者無需 ADD ESP, n

MessageBoxA 參數對應

int 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 指令:更安全的呼叫方式

invoke MessageBoxA, NULL, addr szText, addr szCaption, MB_OK

優點:

  • 參數順序直觀 (左至右)
  • 連結期檢查參數個數/類型匹配
  • 自動處理 ADDR (取位址) 與立即值
  • 程式碼可讀性大幅提升

標準標頭檔:windows.inc 與函數原型庫

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 平台依然保有開發效率與效能優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved