(譯)win32asm教程-11 (轉)
12.0 第一個:namespace prefix = o ns = "urn:schemas--com::office" />
是建立你的第一個程式的時候了。本章中的指導將這樣組織:
12.1第一步
如果萬事具備,你應該在你的masm同一個區上有一個(或win32asm)目錄。為每個工程,你應該建立一個子目錄。
在win32目錄中建立一個名為“Firstprogram“的子目錄。建立一個新的文字並重新命名為“first.asm”。
12.2第二步
在first.asm中輸入一下程式碼:
.486
.model flat, stdcall
option casemap:none
includelib masm32libkernel32.lib
includelib masm32libuser32.lib
include masm32includekernel32.inc
include masm32includeuser32.inc
include masm32include.inc
因為現在,我們僅需要kernel32和user32兩個dll。
12.3第三步
我們將要建立著名的“Hello World”程式。要顯示“hello World”字串,我們要用訊息對話方塊。訊息對話方塊由MessageBox建立。你可以在《win32 程式設計師參考》(看第二章)中查詢這個函式。這是書上說的:
MessageBox函式建立,顯示並操作訊息對話方塊。訊息對話方塊包含應用程式定義的訊息和標題,加上任何預定義的圖示與按鈕的組合。
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);
Parameters
hWnd
ntifies the owner window of the message box to be created. If this parameter is NULL, the message box has no owner window.
lpText
Points to a null-tenated string containing the message to be displayed.
lpCaption
Points to a null-terminated string used for the dialog box title. If this parameter is NULL, the default title Error is used.
uType
Specifies a set of bit flags that determine the contents and behavior of the dialog box. This parameter can be a combination of flags from the following groups of flags.
[--SNIP--]
在這段文字後有所有常數和標誌的列表(他們定義在windows.inc中)。因為它太長了,我沒有在這裡列出來。透過檢視參考,你就知道MessageBox函式要4個引數:父視窗(owner),指向訊息串的指標,指向標題串的指標和訊息框的型別。
HWnd可以是Null。因為我們的程式沒有視窗。
LpText必須是指向我們文字的指標。這僅僅意為引數是文字所在地址的offset。
LpCaption 是標題串的offset。
UType 是參考中解釋的像MB_OK,MB_OKCANCEL,MB_ICONERROR等值的組合。
讓我們先定義兩個用於MessageBox的字串:
在first.asm中加入:
.data
MsgText "Hello world!",0
MsgTitle db "This is a messagebox",0
.data 指示data部分的開始。用db,位元組直接被插入,而且字串又只是位元組的集合,data部分會在包含上面的字串,附加上結尾的0。MsgText裝有第一個字串的offset。MsgTitle有第二個字串的offset。現在我們可以使用函式:
invoke MessageBox, NULL, offset MsgText, offset MsgTitle, Null
但因為用的是invoke,你可以使用(更)ADDR代替offset:
invoke MessageBox, Null, ADDR MsgText, ADDR MsgTitle, Null
我們還沒有看最後一個引數,但這不會有什麼問題。因為MB_OK(有一個ok按鈕的訊息對話方塊的樣式)等於0(NULL)。但你也可以使用其他的任何樣式。Utype(第4個引數)的定義是:
指定一系列決定對話方塊內容與行為的位標誌。這個引數可以是下面標誌組中標誌的組合。
現在以我們要一個有OK按鈕與“information”圖示的簡單訊息對話方塊為例。MB_OK是OK按鈕的樣式,MB_ICONINFORMATION是information圖示的樣式。樣式是用“or”運算子聯合的。這不是or虛擬碼。Masm會在前處理or操作。不用or,你可以用+號(加號)代替,但有時對層疊樣式有問題(一個樣式包含其他一些樣式)。但在本例中你也可以用+號。
.code
start:
invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_OK + MB_ICONINFORMATION
end start
把以上的程式碼加入到你的first.asm檔案中。
我們還加入了一個start標籤。如果你現在彙編你的程式並執行它,它將顯示一個訊息對話方塊但很有可能在你點OK之後就崩潰了。這是因為程式沒有結束,而開始MessageBox程式碼後的任何東西。Windows中程式是用ExitProcess函式結束的:
VOID ExitProcess(
UINT uExitCode //對於所有執行緒的退出程式碼
);
我們可以把0用作退出碼。
把你的程式碼改成這樣:
.code
start:
invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_OK + MB_ICONINFORMATION
invoke ExitProcess, NULL
end start
12.4第4步
因此我們最終的程式是:
.486
.model flat, stdcall
option casemap:none
includelib masm32libkernel32.lib
includelib masm32libuser32.lib
include masm32includekernel32.inc
include masm32includeuser32.inc
include masm32includewindows.inc
.data
MsgText db "Hello world!",0
MsgTitle db "This is a messagebox",0
.code
start:
invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_OK or MB_ICONINFORMATION
invoke ExitProcess, NULL
end start
12.5第5步
現在我們將從產生可執行檔案。
用一下內容新建一個文字檔案並命名為make.bat:
@echo off
ml /c /coff first.asm
link /subsystem:windows first.obj
pause>nul
解釋:
ml /c /coff first.asm
Ml是宏彙編器(masm)。Masm將從程式建立原始程式碼。引數的意思是:
/c =彙編不連結(因為我們用link.exe來做這項工作)
/coff = 產生COFF格式的()檔案,這是Windows可執行檔案的標準格式。
first.asm = a彙編first.asm檔案
link /subsystem:windows first.obj
連結器把object檔案和所有匯入的dll與庫連結起來:
/subsystem:windows = 建立Windows的可執行檔案。
first.obj = 連結 first.obj
如果你把所有的事情都正確的完成了,並執行批處理檔案。將產生first.exe。執行它,看看有什麼結果。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004760/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (譯)win32asm教程-7 (轉)Win32ASM
- (譯)win32asm教程-9 (轉)Win32ASM
- (譯)win32asm教程-8 (轉)Win32ASM
- (譯)win32asm教程-10 (轉)Win32ASM
- (譯)win32asm教程-5 (轉)Win32ASM
- (譯)win32asm教程-6 (轉)Win32ASM
- (譯)win32asm教程-12-完結 (轉)Win32ASM
- (譯)win32asm例項-1 (轉)Win32ASM
- (譯)win32asm例項-3 (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (二) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (四) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (三) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (七) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (六) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (八) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (一) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (五) (轉)Win32ASM
- win32asm原理 (轉)Win32ASM
- Win32Asm 教程,來自易語言俱樂部論壇,譯者taowen。 (5千字)Win32ASM
- Win32ASM經驗點滴 (轉)Win32ASM
- [譯] TensorFlow 教程 #11 - 對抗樣本
- Android 11 原始碼下載+編譯教程Android原始碼編譯
- Max/MSP/Jitter 官方教程翻譯11 - 矩陣混合矩陣
- Java Servlet和JSP教程(11)(轉)JavaServletJS
- Debian11系統編譯安裝Nginx教程。編譯Nginx
- Debian11系統編譯安裝PHP教程。編譯PHP
- Debian11系統編譯安裝Apache教程。編譯Apache
- Debian11系統編譯安裝Docker教程。編譯Docker
- Debian11系統編譯安裝Memcached教程。編譯
- Debian11系統編譯安裝Redis教程。編譯Redis
- Debian11系統編譯安裝phpMyAdmin教程。編譯PHP
- Debian11系統編譯安裝Tomcat教程。編譯Tomcat
- Debian11系統編譯安裝MySQL5.7教程。編譯MySql
- Debian11系統編譯安裝Pure-Ftpd教程。編譯FTP
- 遊戲製作相關---HAM教程翻譯本(五)(轉)遊戲
- 遊戲製作相關---HAM教程翻譯本(四)(轉)遊戲
- PHP基礎教程-11 建立單位轉換器PHP
- VB.Net中文教程(11) Prototype樣式 (轉)