冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 207|回覆: 0
打印 上一主題 下一主題

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

[複製鏈接]

10

主題

0

好友

21

積分

新手上路

Rank: 1

UID
460236
帖子
19
主題
10
精華
0
積分
21
楓幣
661
威望
20
存款
0
贊助金額
0
推廣
0
GP
11
閱讀權限
10
性別
保密
在線時間
16 小時
註冊時間
2024-10-12
最後登入
2024-11-21
跳轉到指定樓層
1
發表於 2024-11-5 11:14:39 |只看該作者 |倒序瀏覽
本帖最後由 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」
  1. OPTION CASEMAP:NONE
  2. .386
  3. .MODEL FLAT,STDCALL
  4. INCLUDE    WINDOWS.INC
  5. INCLUDE    KERNEL32.INC
  6. INCLUDE    USER32.INC
  7. INCLUDELIB KERNEL32.LIB
  8. INCLUDELIB USER32.LIB
  9.    
  10. .DATA
  11. szTitle DB "最簡單的程式",0
  12. szMsg   DB "這是Win32應用程式,是用組合語言編寫的程式。",0

  13. .CODE
  14. start: INVOKE  MessageBox,0,ADDR szMsg,ADDR szTitle,MB_OK
  15.       INVOKE  ExitProcess,0
  16. END    start
複製代碼
2.開啟「命令提示字元」輸入底下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,只是很簡略的說明,如果我理解有錯誤還請指正。

TEST.png (2.45 KB, 下載次數: 0)

TEST執行結果

TEST執行結果

收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1彩票
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-11-21 17:33

回頂部