設定在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]