Win32組合語言程式設計 彈出訊息框

2021-10-05 13:59:40 字數 4562 閱讀 4049

回憶了一下組合語言的專案,通過寫乙個 windows 程式,程式執行時將彈出乙個訊息框並顯示"assembly is great!"來回憶windows api的使用方法。

kernel32.dll中的函式主要處理記憶體管理和程序排程;

user32.dll中的函式主要控制使用者介面;

gdi32.dll中的函式則負責圖形方面的操作。除了上面主要的三個動態鏈結庫,您還可以呼叫包含在其他動態鏈結庫中的函式,當然您必須要有關於這些函式的足夠的資料。

動態鏈結庫,顧名思義,這些 api 的**本身並不包含在 windows 的可執行檔案中,而是當要使用時才被載入。為了讓應用程式在執行時能找到這些函式,就必須事先把有關的重定位資訊嵌入到應用程式的可執行檔案中。這些資訊存在於引入庫中,由鏈結器把相關資訊從引入庫中找出插入到可執行檔案中。您必須指定正確的引入庫,因為只有正確的引入庫才會有正確的重定位資訊。

當應用程式被載入時 windows 會檢查這些資訊,這些資訊包括動態鏈結庫的名字和其中被呼叫的函式的名字。若檢查到這樣的資訊,windows就會載入相應的動態鏈結庫,並且重定位呼叫的函式語句的入口位址,以便在呼叫函式時控制權能轉移到函式內部。

前一類函式名字的尾部帶乙個"a"字元,處理unicode的則帶乙個"w"字元("w"代表寬字元)。我們比較熟悉的ansi字串是以 null 結尾的一串字元陣列,每乙個ansi字元是乙個 byte 寬。對於歐洲語言體系,ansi 字符集已足夠了,但對於有成千上萬個唯一字元的幾種東方語言體系來說就只有用 unicode 字符集了。每乙個 unicode 字元占有兩個 byte 寬,這樣一來就可以在乙個字串中使用 65336 個不同字元了。

這也是為什麼引進 unicode

的原因。在大多數情況下我們都可以用乙個包含標頭檔案,在其中定義乙個巨集,然後在實際呼叫函式時,函式名後不需要加字尾"a"或"w"。比如說:在標頭檔案中定義函式foo():

#ifdef unicode

#define foo()

foow()

#else

#define foo() fooa()

#endif

把框架程式放在下面,然後我們再向裡面加東西。

.386

.model flat, stdcall

.data

.code

start:

end start

應用程式的執行是從 end 定義的識別符號後的第一條語句開始的。在上面的框架程式中就是從 start 開始。程式逐條語句執行一直到遇到

jmp,jne,je,ret 等跳轉指令。這些跳轉指令將把執行權轉移到其他語句上,若程式要退出 windows,則必須呼叫函式 exitprocess。

exitprocess proto uexitcode:dword
functionname proto [parametername]:datatype,[parametername]:datatype,...
簡言之,就是在函式名後加偽指令proto,再跟一串由逗號相隔的資料型別鍊錶。在前面的 exitprocess 定義中,該函式有乙個 dword

型別的引數。當您使用高層呼叫語句 invoke 時,使用函式原型定義特別有用,您可以簡單地認為 invoke 是乙個有引數型別檢查的呼叫語句。譬如,假設這樣寫:

call exitprocess
invoke exitprocess
invoke expression [,arguments]
expression 既可以是乙個函式名也可以是乙個函式指標。引數由逗號隔開。大多數api函式的原型放在標頭檔案中。 如果您用的是 hutch 的

masm32,這些標頭檔案在資料夾masm32/include 下, 這些標頭檔案的擴充套件名為 inc,函式名和 dll 中的函式名相同,譬如:kernel32.lib 引出的函式 exitprocess 的函式原形宣告於kernel.inc中。您也可以自己宣告函式原型。

好,我們現在回到exitprocess 函式,引數uexitcode 是您希望當您的應用程式結束時傳遞 windows 的。 您可以這樣寫:

invoke exitprocess,0
把這一行放到開始識別符號下,這個應用程式就會立即退出 windows,當然毫無疑問個應用程式本身是乙個完整的 windows 程式。

.386

.model flat, stdcall

option

casemap:none

include \masm32\include\windows.inc

include

\masm32\include\kernel32.inc

includelib

\masm32\lib\kernel32.lib

.data

.code

start:

invoke

exitprocess,0

end start

option casemap:none 一句的意思是告訴 masm 要區分標號的大小寫,譬如:start 和 start 是不同的。請注意新的偽指令

include,跟在其後的檔名所指定的檔案在編譯時將「插」在該處。在我們上面的程式段中,當masm處理到語句 include \masm\include\windows.inc 時,它就會開啟資料夾\masm32\include中的檔案windows.inc,這和您把整個檔案都貼上到您的源程式中的效果是一樣的。 hutch 的 windows.inc 包含了 win32程式設計所需要的常量和結構體的定義。 但是它不包含函式原型的定義。

好了,現在儲存例子,取名為msgbox.asm。把 ml.exe 的路徑放到 path 環境變數中,鍵入下面一行 進行編譯:

ml /c /coff /cp msgbox。asm (譯者注:命令列引數大小寫是有區別的)

/c 是告訴masm只編譯不鏈結。這主要是考慮到在鏈結前您可能還有其他工作要做。

/coff 告訴masm產生的目標檔案用 coff 格式。masm 的 coff 格式是coff(common object file

format:通用目標檔案格式) 格式的一種變體。在 unix 下的 coff 格式又有不同。

/cp 告訴 masm 不要更改使用者定義的識別符號的大小寫。若您用的是 hutch 的包含檔案的話,在.model 指令下加入 「option

casemap:none」 語句,可達到同樣的效果。

當您成功的編譯了 msgbox.asm 後,編譯器會產生 msgbox.obj目標檔案,目標檔案和可執行檔案只一步之遙,目標檔案中包含了以二進位制形式存在的指令和資料,比可執行檔案相差的只是鏈結器加入的重定位資訊。

好,我們來鏈結目標檔案:

link /subsystem:windows /libpath:c:\masm32\lib msgbox.obj

下面我們來做一點可以看的見摸的著的,我們在程式中加入乙個對話方塊。該函式的原型如下:

messagebox proto hwnd:dword, lptext:dword, lpcaption:dword, utype:dword
hwnd 是父視窗的控制代碼。控制代碼代表您引用的視窗的乙個位址指標。它的值對您編 windows 程式並不重要。您只要知道它代表乙個視窗。當您要對視窗做任何操作時,必須要引用該視窗的指標。

lptext 是指向您要顯示的文字的指標。指向文字串的指標事實上就是文字串的首位址。

lpcaption 是指向您要顯示的對話方塊的標題文字串指標。

utype 是顯示在對話方塊視窗上的小圖示的型別。

下面是源程式:

.386 

.model flat,stdcall

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib

include \masm32\include\user32.inc

includelib \masm32\lib\user32.lib

.data

msgboxcaption db "iczelion tutorial no.2",0

msgboxtext db "win32 assembly is great!",0

.code

start:

invoke messagebox, null, addr

msgboxtext, addr msgboxcaption, mb_ok

invoke exitprocess, null

end start

Win32組合語言教程(1)

一 引言 win32應用程式一般使用c語言程式設計,但是在某些需要進行深層程式設計的情況下,例如win32應用程式執行機制分析 病毒清除 加密解密等深層程式設計,或者對於某些速度要求較高的程式,需要使用組合語言 甚至機器語言 直接編寫win32應用程式。win32應用程式雖然和其他32位應用程式 例...

win32程式設計 滑鼠訊息

忙起來的時候感覺什麼都不缺,空下來以後才發現什麼都沒有。網易雲熱評 一 基本滑鼠訊息 wm lbuttondown 滑鼠左鍵按下wm lbuttonup 滑鼠左鍵抬起wm rbuttondown 滑鼠右鍵按下wm rbuttonup 滑鼠右鍵抬起wm mousemove 滑鼠移動訊息1 訊息引數 w...

Win32 組合語言系列教程 導航選單

win32彙編系列教程是由本人學習 intel 組合語言程式設計 第五版 時根據學到的理論技術,結合實踐編寫的一套簡潔明瞭的彙編入門學習手冊,該手冊中摒棄了過多的無用文字描述,筆者通過理解文中知識點,並通過自己的想法將知識點融入到每乙個小小的案例中,讓學習彙編從此不在困難。文章標題 win32彙編 ...