Win32彙編環境搭建教程(MASM32 SDK)

1、說明

經常使用的32位彙編編譯器有微軟的MASM、Borland的TASM和NASM。html

編譯器 開發者 優勢 缺點
MASM 微軟 微軟自家軟件和系統兼容性好;支持invoke/.if等僞指令將彙編變得和C++差很少 就一個編譯器,沒有資源編譯器和連接器,也沒有頭文件
TASM Borland 支持僞指令,有資源編譯器和連接器 沒有Windows數據結構和預約義的頭文件,如今官方彷佛不維護了
NASM 開源 同時支持Windows和Linux 不支持僞指令,沒有Windows數據結構和預約義的頭文件

 

 

 

 

 

不過他們各有本身的不足,通常使用基於MASM的MASM32 SDK作爲開發環境;雖然叫masm32 可是直接裝在64位操做系統上也是沒問題的。編程

 

2、MASM32 SDK安裝

2.1 下載

下載連接:http://www.masm32.com/download.htmwindows

 

2.2 安裝

當前我下載的是v11r版本,將下載的zip包解壓後獲得的是一個齒輪圖標的install.exe文件,雙擊運行開始安裝。安全

選擇安裝的磁盤(masm32 sdk須要安裝在根目錄下因此只能選磁盤不能自定義目錄)數據結構

後續一路點「肯定」、「Yes」或「OK」就好了,直到下圖所示即完成安裝。ui

 

2.3 配置環境變量

打開:控制面板--系統和安全--系統--高級系統設置--高級--環境變量spa

建立如下環境變量(若是已存在則在其末尾追加,Masm32Dir根據本身安裝路徑修改):操作系統

Masm32Dir=D:\masm32
include=%Masm32Dir%\Include;
lib=%Masm32Dir%\lib;
path=%Masm32Dir%\Bin;%Masm32Dir%;

 

3、MASM32 SDK開發示例

3.1 集成開發環境

無論什麼語言開發,咱們習慣於有一個IDE以方便編寫、編譯、連接、調試,MASM32 SDK自帶有一個IDE----Quick Editor(安裝完後在桌面創的那個快捷方式就是),但它實質就只是一個簡單的文本編緝器,實際上32位彙編當前就沒有什麼IDE(RadASM和MASMPlus沒用過不過感受也不是咱們認識的那種IDE)。.net

32位彙編開發通常都是用UtralEdit或Notepad++等文本編緝器編寫代碼文件和資源文件,而後手動敲命令進行編譯連接(下節咱們會演示這個過程)。設計

其實沒有IDE這樣手動也不全是壞事,既然都學彙編了不如索性全手動。

 

3.2 示例代碼

資源文件helloworld.rc:

// 資源文件註釋格式爲雙斜槓
// 包含資源頭文件,以能使用頭鍵字
#include    <resource.h>

// 指定對話框ID,asm文件中要定義同值變量纔可引用
#define    DLG_HELLOWORLD    1

// 定義對話框結構
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,21
    CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,6,79,203,1
    DEFPUSHBUTTON "退出",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值關聯的,控件名並不須要與rc文件相同,不過爲了易看通常取同樣的
; 好比這裏重點是equ 1,叫不叫DLG_HELLOWORLD無所謂,不過爲了易看因此選擇與rc文件保持一致
DLG_HELLOWORLD    equ    1

; 數據段
.data?
hInstance    dd    ?

; 代碼段
.code
; 對話框處理過程
_ProcDlgHelloworld proc uses ebx edi esi hWnd,wMsg,wParam,lParam
    mov    eax,wMsg
    .if eax == WM_CLOSE
            invoke    EndDialog,hWnd,NULL
    .elseif eax == WM_INITDIALOG
            ;invoke    LoadIcon,hInstance,ICO_MAIN
            ;incoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
    .elseif eax == WM_COMMAND
            mov    eax,wParam
            .if ax == IDOK
                    invoke    EndDialog,hWnd,NULL
            .endif
    .else
            mov    eax,FALSE
            ret
    .endif
    mov    eax,TRUE
    ret
_ProcDlgHelloworld    endp

start:
    invoke    GetModuleHandle,NULL
    mov       hInstance,eax
    ; 彈出對話框,對話框與及處理過程在這裏綁定
    invoke    DialogBoxParam,hInstance,DLG_HELLOWORLD,NULL,offset _ProcDlgHelloworld,NULL
    invoke    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

程序運行界面以下:

 

4、藉助VC++6.0【可選】

所謂藉助vc其藉助之處有二:一是直接用vc來編寫資源文件,二能夠借用nmake.exe來進行編譯連接。

 4.1 使用VC++6.0編寫資源文件

在前面helloworld中咱們直接手動編寫資源文件(helloworld.rc),這種方式因爲不是所見即所得在實際編寫時爲了調整位置和大小,須要反覆進行修改編譯運行,這是比較麻煩的。咱們可使用vc進行所見即所得的資源文件編緝。

不過VC++編緝.rc文件保存時會自動添加一些VC++的頭文件若是繼續保存爲.rc文件,爲了保證使用rc命令編譯成.res時能找到全部文件,須要把VC++的%VC_HOME%\VC98\Include目錄追加到第3步中的include環境變量中,把%VC_HOME%\VC98\Lib目錄追加到第3步中的lib環境變量中;固然也能夠在編緝後直接保存成編譯好的.res文件,免去rc編譯步驟。

能夠建一個VC項目來編緝資源文件最後把複製出來用,也能夠先編譯出一個res文件而後託到vc裏編緝。

 

4.2 借用nmake.exe進行編譯連接

在前面helloworld程序中,咱們經過rc、ml和link三條命令進行編譯連接,每次改動都得反覆敲打執行這幾條命令這是比較麻煩的。

nmake能夠直接根據makefile執行rc、ml和link完成程序編譯連接(makefile放於與源代碼同級目錄下,在makefile目錄下執行nmake),若是是一個比較大的須要反覆修改的程序建議使用nmake進行編譯連接。操做過程以下:

第一步,到%VC_HOME%\VC98\Bin目錄下把nmake.exe複製到%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 *.obj
    del *.res

編譯運行以下(每次修改至關於只須要執行nmake一條命令操做簡單多了):

 

參考:

Windows環境下32位彙編語言程序設計

相關文章
相關標籤/搜索