Win32汇编环境搭建教程(MASM32 SDK)
一、說明
常用的32位匯編編譯器有微軟的MASM、Borland的TASM和NASM。
| 編譯器 | 開發(fā)者 | 優(yōu)點 | 缺點 |
| MASM | 微軟 | 微軟自家軟件和系統(tǒng)兼容性好;支持invoke/.if等偽指令將匯編變得和C++差不多 | 就一個編譯器,沒有資源編譯器和鏈接器,也沒有頭文件 |
| TASM | Borland | 支持偽指令,有資源編譯器和鏈接器 | 沒有Windows數(shù)據(jù)結(jié)構(gòu)和預(yù)定義的頭文件,現(xiàn)在官方似乎不維護了 |
| NASM | 開源 | 同時支持Windows和Linux | 不支持偽指令,沒有Windows數(shù)據(jù)結(jié)構(gòu)和預(yù)定義的頭文件 |
?
?
?
?
?
不過他們各有自己的不足,一般使用基于MASM的MASM32 SDK做為開發(fā)環(huán)境;雖然叫masm32 但是直接裝在64位操作系統(tǒng)上也是沒問題的。
?
二、MASM32 SDK安裝
2.1 下載
下載鏈接:http://www.masm32.com/download.htm
?
2.2 安裝
當前我下載的是v11r版本,將下載的zip包解壓后得到的是一個齒輪圖標的install.exe文件,雙擊運行開始安裝。
選擇安裝的磁盤(masm32 sdk需要安裝在根目錄下所以只能選磁盤不能自定義目錄)
后續(xù)一路點“確定”、“Yes”或“OK”就行了,直到下圖所示即完成安裝。
?
2.3 配置環(huán)境變量
打開:控制面板--系統(tǒng)和安全--系統(tǒng)--高級系統(tǒng)設(shè)置--高級--環(huán)境變量
創(chuàng)建以下環(huán)境變量(如果已存在則在其末尾追加,Masm32Dir根據(jù)自己安裝路徑修改):
Masm32Dir=D:\masm32 include=%Masm32Dir%\Include; lib=%Masm32Dir%\lib; path=%Masm32Dir%\Bin;%Masm32Dir%;?
三、MASM32 SDK開發(fā)示例
3.1 集成開發(fā)環(huán)境
不管什么語言開發(fā),我們習慣于有一個IDE以方便編寫、編譯、鏈接、調(diào)試,MASM32 SDK自帶有一個IDE----Quick Editor(安裝完后在桌面創(chuàng)的那個快捷方式就是),但它實質(zhì)就只是一個簡單的文本編緝器,實際上32位匯編當前就沒有什么IDE(RadASM和MASMPlus沒用過不過感覺也不是我們認識的那種IDE)。
32位匯編開發(fā)一般都是用UtralEdit或Notepad++等文本編緝器編寫代碼文件和資源文件,然后手動敲命令進行編譯鏈接(下節(jié)我們會演示這個過程)。
其實沒有IDE這樣手動也不全是壞事,既然都學(xué)匯編了不如索性全手動。
?
3.2 示例代碼
資源文件helloworld.rc:
// 資源文件注釋格式為雙斜杠 // 包含資源頭文件,以能使用頭鍵字 #include <resource.h>// 指定對話框ID,asm文件中要定義同值變量才可引用 #define DLG_HELLOWORLD 1// 定義對話框結(jié)構(gòu) DLG_HELLOWORLD DIALOG 350,200,213,164 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Helloworld Program" FONT 11,"宋體" {CTEXT "Win32 Assembly Helloworld Program",-1,50,54,170,21CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,6,79,203,1DEFPUSHBUTTON "退出",IDOK,158,86,50,21 }代碼文件helloworld.asm:
; asm文件注釋格式為分號 ; 定義程序模式 .386 .model flat,stdcall option casemap :none; 包含必要頭文件,基本每個win32 匯編程序都需要包含這幾個 include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib; 指定對話框ID,該ID要與rc文件中的ID值相同 ; 理論上,asm文件與rc文件中的控件是通過ID值關(guān)聯(lián)的,控件名并不需要與rc文件相同,不過為了易看一般取一樣的 ; 比如這里重點是equ 1,叫不叫DLG_HELLOWORLD無所謂,不過為了易看所以選擇與rc文件保持一致 DLG_HELLOWORLD equ 1; 數(shù)據(jù)段 .data? hInstance dd ?; 代碼段 .code ; 對話框處理過程 _ProcDlgHelloworld proc uses ebx edi esi hWnd,wMsg,wParam,lParammov eax,wMsg.if eax == WM_CLOSEinvoke EndDialog,hWnd,NULL.elseif eax == WM_INITDIALOG;invoke LoadIcon,hInstance,ICO_MAIN;incoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax .elseif eax == WM_COMMANDmov eax,wParam.if ax == IDOKinvoke EndDialog,hWnd,NULL.endif.elsemov eax,FALSEret.endifmov eax,TRUEret _ProcDlgHelloworld endpstart:invoke GetModuleHandle,NULLmov hInstance,eax; 彈出對話框,對話框與及處理過程在這里綁定 invoke DialogBoxParam,hInstance,DLG_HELLOWORLD,NULL,offset _ProcDlgHelloworld,NULLinvoke ExitProcess,NULL; 指定程序入口點為start標識處end start?
3.3 編譯運行
我這里將兩個文件保存在了F:\masm32\helloworld目錄下,編譯運行如下:
rc helloworld.rc ml /c /coff helloworld.asm link /subsystem:windows helloworld.obj helloworld.res helloworld.exe程序運行界面如下:
?
四、借助VC++6.0【可選】
所謂借助vc其借助之處有二:一是直接用vc來編寫資源文件,二可以借用nmake.exe來進行編譯鏈接。
?4.1 使用VC++6.0編寫資源文件
在前面helloworld中我們直接手動編寫資源文件(helloworld.rc),這種方式由于不是所見即所得在實際編寫時為了調(diào)整位置和大小,需要反復(fù)進行修改編譯運行,這是比較麻煩的。我們可以使用vc進行所見即所得的資源文件編緝。
不過VC++編緝.rc文件保存時會自動添加一些VC++的頭文件如果繼續(xù)保存為.rc文件,為了保證使用rc命令編譯成.res時能找到所有文件,需要把VC++的%VC_HOME%\VC98\Include目錄追加到第3步中的include環(huán)境變量中,把%VC_HOME%\VC98\Lib目錄追加到第3步中的lib環(huán)境變量中;當然也可以在編緝后直接保存成編譯好的.res文件,免去rc編譯步驟。
可以建一個VC項目來編緝資源文件最后把復(fù)制出來用,也可以先編譯出一個res文件然后托到vc里編緝。
?
4.2 借用nmake.exe進行編譯鏈接
在前面helloworld程序中,我們通過rc、ml和link三條命令進行編譯鏈接,每次改動都得反復(fù)敲打執(zhí)行這幾條命令這是比較麻煩的。
nmake可以直接根據(jù)makefile執(zhí)行rc、ml和link完成程序編譯鏈接(makefile放于與源代碼同級目錄下,在makefile目錄下執(zhí)行nmake),如果是一個比較大的需要反復(fù)修改的程序建議使用nmake進行編譯鏈接。操作過程如下:
第一步,到%VC_HOME%\VC98\Bin目錄下把nmake.exe復(fù)制到%Masm32Dir%\Bin目錄下。
第二步,編寫makefile。
第三步,進行編譯運行。
以前邊helloworld程序為例,makefile如下:
EXE = helloworld.exe #指定輸出文件 OBJS = helloworld.obj #需要的目標文件 RES = helloworld.res #需要的資源文件LINK_FLAG = /subsystem:windows #連接選項 ML_FLAG = /c /coff #編譯選項$(EXE): $(OBJS) $(RES)Link $(LINK_FLAG) $(OBJS) $(RES).asm.obj:ml $(ML_FLAG) $< .rc.res:rc $<clean:del *.objdel *.res編譯運行如下(每次修改相當于只需要執(zhí)行nmake一條命令操作簡單多了):
?
參考:
Windows環(huán)境下32位匯編語言程序設(shè)計
轉(zhuǎn)載于:https://www.cnblogs.com/lsdb/p/7402955.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Win32汇编环境搭建教程(MASM32 SDK)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python__封装
- 下一篇: 洛谷 P2590 [ZJOI2008]树