; Test2_1.asm
.386
.model flat, stdcall
include Windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
szCaption db 'Hi', 0
szMsg db 'Hello World!', 0
.code
start:
invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
invoke ExitProcess, NULL
end start
建立過程:
1、文件 -> 新建工程 -> 工程類型: Win32 App (no res)、工程名稱: Test1 -> 默認下去到完成.
2、打開 Test1.asm 輸入以上代碼, 然後編譯執行. 結果如下:
程序注釋:
; Test1.asm
; 分號是單行注釋
comment %
注釋還可以使用 comment, 現在兩個百分號之間的是注釋內容, 其中的百分號也可以換做其他符號, 譬如 ^
%
COMMENT ^
這也是注釋,
還是多用 ; 吧, 比較方便 ^
; ********************************
.386
.model flat, stdcall
;.386 和 .model 都是是匯編偽指令; .386 表示使用 386 指令集, 這是 Win32 程序的最低需求.
;類似的還有 .8086 .286 .386p .486 .486p .586 .586p .mmx 等, 其中的 p 表示可以使用一些特權指令.
;.model 用於定義工作模式;
;flat 是內存模式, 類似還有: tiny small medium compact large huge, Win32 程序只能選擇 flat;
;stdcall 是語言模式, 類似的還有: c syscall basic fortran pascal, 使用 Win32 API 必須選擇 stdcall.
; ********************************
include Windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
;kernel32.dll 是系統服務接口, 負責內存管理等;
;user32.dll 是用戶服務接口, 負責消息管理等;
;下面的程序會用到它們的函數.
;user32.inc 和 kernel32.inc 中分別包含著對應 DLL 的函數、常量、結構的聲明.
;Windows.inc 包含著 Win32 程序用到的常量、結構的聲明; 譬如下面用到的 MB_OK 常量就是在其中聲明.
;程序在編譯時, 見到 include (偽)指令就會把它指定的 inc 文件(或 asm) 文件復制到當前位置.
;lib 文件包含了相應 DLL 的函數信息(主要是位置信息), 程序在鏈接階段會提取這些信息;
;程序運行時會根據這些信息去調用 DLL 中的相應的函數.
;inc 和 lib 文件分別存放在 masm32\include\ 和 masm32\lib\ 下.
; ********************************
.data
szCaption db 'Hi', 0
szMsg db 'Hello World!', 0
;.data 說明這是程序的數據段, 下面的 .code 是代碼段
;後面還會接觸到 .const(常量段)、.data?(變量段)等
;這裡是定義了兩個字符串變量 szCaption、szMsg, 後面的 0 表示是 0 結束的字符串.
;關於 db 等後面詳細探討.
; ********************************
.code
start:
invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
invoke ExitProcess, NULL
end start
;這段程序用到了兩個 API 函數: MessageBox(顯示消息框)、ExitProcess(退出程序);
;這兩個函數分別來自 user32.dll 和 kernel32.dll.
;invoke 是調用函數或子過程的偽指令.
;addr 是取地址的偽指令, 這裡也可以換做 offset
;start 是隨便命名的標號, 用於表示程序段的開始和結束
;另外匯編本來是不區分大小寫的, 但在使用 WinAPI 和 C 函數時必須注意大小寫
;標號(如 start)也要注意大小寫
;匯編會忽略多余的空白, 可用 \ 續行, 譬如:
invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
;可寫作:
invoke MessageBox, NULL,\
addr szMsg,\
addr szCaption,\
MB_OK