ikj78i 發表於 2024-11-5 11:14:39

設定在Windows系統下用組合語言編寫Win32應用程式

本帖最後由 ikj78i 於 2024-11-15 06:01 編輯

甲、本帖說明如何設定使用組合語言在Windows系統中撰寫Win32應用程式。首先要說明的是:
 1.此環境可以在32位元或64位元的Windows編寫組合語言。(Windows 7/8/8.1/10/11都可分為32位元或64位元版)
 2.此環境可以製作出32位元的Windows應用程式,無法製作64位元的應用程式。

乙、步驟:
 1.下載MASM32 SDK。下載網址:https://www.masm32.com/download.htm
 2.解壓縮masm32v11r.zip檔案後執行install.exe,依提示安裝即可。假設選擇安裝磁碟機為「C:」
  masm32v11r.zip是MASM32 SDK第11版,內含ML.EXE第6.14版,ML.EXE是用來組譯組合語言原始檔的組譯器。
  我們寫好的組合語言原始檔是純文字檔,電腦看不懂,必須經由ML.EXE「翻譯」成電腦看得懂的一大串0與
  1的數字,此過程稱為「組譯」。
 3.安裝除錯器:可安裝OllyDbg(https://www.ollydbg.de/)或x64dbg(https://x64dbg.com/)
   當程式有錯誤無法正確執行時,才需要除錯器糾正錯誤。前者OllyDbg是老牌的除錯器;x64dbg是後起之秀
   ,它可以對32位元或64位元的應用程式除錯。
 4.安裝文書處理器。也可以不安裝,直接使用記事本。

丙、檢查是否能正常運作:用底下的組合語言原始程式檢驗,組譯、執行過程,是否能正確執行。
 1.組合語言原始程式內容如下,將它存入D:磁碟機的SOURCE資料及內,也就是「D:\SOURCE\TEST.ASM」OPTION CASEMAP:NONE
.386
.MODEL FLAT,STDCALL
INCLUDE    WINDOWS.INC
INCLUDE    KERNEL32.INC
INCLUDE    USER32.INC
INCLUDELIB KERNEL32.LIB
INCLUDELIB USER32.LIB
   
.DATA
szTitle DB "最簡單的程式",0
szMsg   DB "這是Win32應用程式,是用組合語言編寫的程式。",0

.CODE
start: INVOKE  MessageBox,0,ADDR szMsg,ADDR szTitle,MB_OK
      INVOKE  ExitProcess,0
END    start2.開啟「命令提示字元」輸入底下A.~H.指令:
    A. SET INCLUDE=C:\masm32\INCLUDE;%INCLUDE%
    B. SET LIB=C:\masm32\LIB;%LIB%
    C. SET PATH=C:\masm32\BIN;%PATH%  
    D. SET ML=/coff /link /SUBSYSTEM:WINDOWS
    E. D:
    F. CD \SOURCE
    G. ML TEST.ASM
    H. TEST
    說明:
    A.設定要去那兒讀取含入檔。因為WINDOWS.INC、KERNEL32.INC、USER32.INC三個含入檔都在
   「C:\masm32\INCLUDE」資料夾內。%INCLUDE%是用來讓原有的設定延續下去。
    B.設定要去那兒讀取程式庫。因為KERNEL32.LIB、USER32.LIB在「C:\masm32\LIB」內。
    C.設定ML.EXE在那兒。因為組譯器ML.EXE在「C:\masm32\BIN」內。
    D.因為每種系統的可執行檔格式不同,所以設定ML.EXE組譯成coff格式及生成在WINDOWS系統的可執行檔。
   coff是OBJ格式的一種,它必須和LIB連結才能變成.EXE。
    E.、F.切換到D:碟的SOURCE資料夾,這是TEST.ASM所在資料夾。
    G.開始組譯。
    H.執行TEST.EXE如果成功就會看到下圖:
  
丁、簡要說明TEST.ASM
 1.「OPTION CASEMAP:NONE」設定變數名、Win32 API名區分大小寫,Windows系統中都是這樣設定,因此這
  一行是必須的。
 2.設定CPU指令集為386指令集。
 3.必須這樣設定。
 4.~6..INC內定義了常數及Win32 API,因此一開始包含WINDOWS.INC、KERNEL32.INC、USER32.INC。例如
  MB_OK就定義在WINDOWS.INC內
 7~8..LIB定義了呼叫Win32 API時所需的資料。
 10~12..DATA
    szTitle DB "最簡單的程式",0
    szMsg   DB "這是在 Win32 作業系統,用組合語言寫的程式。",0
    .DATA是定義資料區段,在資料區段內定義了兩個字串szTitle、szMsg
  14..CODE定義程式碼區段
 15.MessageBox是一個Win32 API,其作用就是建立一個對話盒,第一個參數是此對話盒屬於桌面,第二個參數是對話
  盒內字串位址,第三個參數是對話盒標題欄字串位址,第四個參數是顯示「確定」按鈕。在Windows系統中,執行
  許多事都靠呼叫作業系統的「副程式」完成,這些副程式集合起來稱為Win32 API,都內建在Windows中的許多
  .DLL內。呼叫的指令是INVOKE。ADDR是取得位址的意思,變數都存在記憶體中的某個地方,此地方稱為位址。
 16.ExitProcess也是一個Win32 API,其作用是結束應用程式,並將第一個參數傳回給系統。
 17.「END start」告訴系統,這個程式的進入點(第一個執行的指令)是在start處。

戊、後記
 本篇摘自小木偶的網頁:https://wanker742126.neocities.org,只是很簡略的說明,如果我理解有錯誤還請指正。
頁: [1]
查看完整版本: 設定在Windows系統下用組合語言編寫Win32應用程式