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

Win32 組合語言教學:從基礎指令到視窗程式完整入門

     編輯:關於C++

這是一份持續更新的 Win32 組合語言教學系列,著重於在 Windows 環境下撰寫組語程式,而非傳統的 DOS 中斷導向教學。內容涵蓋工具鏈建置、CPU 暫存器、記憶體模型、指令集、巨集、Windows API 呼叫慣例、訊息迴圈、視窗建立完整範例,適合想深入理解底層運作的開發者。

教學大綱與重點摘要

第 0 章:工具鏈準備

  • 組譯器:MASM(推薦,支援 invoke、型別檢查),替代 TASM/NASM。
  • 連結器:Microsoft Incremental Linker (link.exe)。
  • 資源編輯器:Borland Resource Workshop(需搭配 brc32.exe 編譯資源)。
  • 文字編輯器:UltraEdit(支援語法高亮、函數列表)。
  • 參考手冊:Win32 程式設計師參考 (win32.hlp),現建議改用 MSDN。

安裝路徑建議放在同一磁碟分割,並將 MASM bin 目錄加入 PATH。

第 1-3 章:組語基礎觀念

  • 指令碼與機器碼:add eax, edx → 66 03 C2。
  • 通用暫存器:EAX/AX/AH/AL、EBX、ECX、EDX(32/16/8 位元重疊)。
  • 段暫存器:CS/DS/SS/ES/FS/GS(Win32 採平坦模式,通常不需操作)。
  • 指標與堆疊暫存器:ESI/EDI、EIP、ESP/EBP。
  • 平坦記憶體模型:32 位元位址空間 4GB,無段式管理,僅使用位移。

第 4-5 章:資料定義與基本運算指令

  • .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 設定旗標。

第 6 章:堆疊與程序呼叫

  • 堆疊 LIFO:PUSH/POP、CALL/RET。
  • 參數傳遞:呼叫者由右至左 PUSH 參數,CALL 進入程序,RET 返回並清理堆疊(STDCALL 慣例)。
  • 區域變數:LOCAL var:DWORD 配置於堆疊框架,RET 時自動釋放。
  • 回傳值慣例:EAX 為主要回傳暫存器。

第 7 章:條件跳轉與旗標

  • 旗標暫存器:ZF(零)、SF(號)、CF(借位/進位)、OF(溢位)。
  • 無條件 JMP、條件 JZ/JNZ/JG/JL/JA/JB/JGE/JLE/JAE/JBE 等。
  • 有號/無號比較對應不同跳轉指令(JG vs JA)。

第 8 章:MASM 高階語法簡化控制流程

.IF eax == 1
    ; ...
.ELSEIF ecx != 2
    ; ...
.ELSE
    ; ...
.ENDIF

.WHILE eax == 1
    INC eax
    .BREAK .IF eax == 7
.ENDW

.REPEAT
    ; ...
.UNTIL eax == 1

編譯器自動轉換為對應的 CMP/Jcc 指令,大幅提升可讀性。

第 9 章: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。

第 10-13 章:Windows 視窗程式完整實作

  1. 框架:.486 / .model flat, stdcall / option casemap:none、includelib 系統庫、include 標頭檔。
  2. 資料區:視窗類別名稱、標題字串。
  3. WinMain:GetModuleHandle 取得實例控制代碼、填寫 WNDCLASSEX 結構、RegisterClassEx 註冊類別。
  4. 建立視窗:CreateWindowEx、ShowWindow、UpdateWindow。
  5. 訊息迴圈:GetMessage/TranslateMessage/DispatchMessage 循環。
  6. 視窗程序:處理 WM_CREATE、WM_DESTROY(呼叫 PostQuitMessage)、其他交給 DefWindowProc。

第一支 Hello World 程式完整原始碼

.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、驅動程式開發或單純追求極致控制的專案。

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