(譯)win32asm教程-11 (轉)

gugu99發表於2008-05-28
(譯)win32asm教程-11 (轉)[@more@] 

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章