Win32組合語言教程(1)

2021-08-26 07:23:46 字數 2394 閱讀 5093

一、引言

win32應用程式一般使用c語言程式設計,但是在某些需要進行深層程式設計的情況下,例如win32應用程式執行機制分析、病毒清除、加密解密等深層程式設計,或者對於某些速度要求較高的程式,需要使用組合語言(甚至機器語言)直接編寫win32應用程式。win32應用程式雖然和其他32位應用程式(例如32位保護模式dos程式)一樣可以使用386組合語言和保護模式程式設計,但是win32應用程式的執行機制與其他32位應用程式有一定的差別,例如訊息迴圈、動態鏈結等,win32組合語言也有其特殊的程式設計方式。目前國內極少看到有關win32組合語言的資料,市面上的組合語言書籍一般只介紹dos實模式組合語言和386保護模式組合語言,金山公司的《深入windows程式設計》一書雖然介紹了使用組合語言寫windows應用程式的方法,可惜該書只介紹了win16組合語言。為了使大家能對win32組合語言的基本程式設計方法有一定的了解,近日得閒,筆者編寫了本教程,旨在拋磚引玉,如果本教程能夠帶領你走進神秘的win32組合語言世界,筆者心願足矣。使用本教程,要求讀者具有c語言編寫win32應用程式(win32sdk程式設計)的基礎。

二、進行win32組合語言程式設計的基本軟體

進行win32組合語言程式設計,應該準備下列基本軟體:

1、masm 6.11以上版本的彙編器

masm是microsoft公司的彙編器,這是最基本的軟體,必需masm 6.11以上版本才能夠彙編win32組合語言源程式。不過進行win32組合語言程式設計不必要全套的masm 6.11,只要乙個ml.exe檔案就可以了,windows 95 ddk中帶有masm 6.11c的ml.exe文

件,windows 98 ddk中帶有masm 6.11d的ml.exe檔案,都可以使用。turbo masm 5.0(tasm)是borland公司的彙編器,也可以用來彙編win32組合語言源程式,但是tasm的部分語法與masm不同,用於masm的win32組合語言源程式可能需要修改後才能用tasm彙編。本教程中的所有win32組合語言源程式都基於masm。

2、win32sdk

進行win32組合語言程式設計需要用到win32sdk中的資源編譯器(rc.exe)和聯結器(link.exe),還需要用到win32sdk中的引入庫檔案(kernel32.lib、user32.lib、gdi32.lib等)。如果沒有win32sdk,platform sdk也可以,還可以安裝visual c++ 2.0以上版本的visual c++,筆者使用的是visual c++ 6.0。borland c++ 4.0以上版本的borland c++也可以使用,只是資源編譯器和聯結器的

檔名不同,分別是brc.exe(brc32.exe)和tlink.exe(tlink32.exe),選項也不盡相同,另外borland c++不支援coff格式的obj檔案,彙編時不能使用/coff選項。

3、組合語言編輯器

乙個普通的文字編輯器,用於編輯win32組合語言源程式。edit、pwb等都可以,visual c++等程式語言中的編輯器也可以,甚至word、wps 97等可以編輯文字檔案的字處理軟體都可以,不過筆者推薦使用asmedit,這是乙個專用的組合語言編輯

器,效果非常好。win32組合語言一般使用命令列方式彙編連線,經過一定的設定也可以在某些整合

環境(pwb、visual c++、asmedit等)下彙編連線,還可以使用nmake工具,不過本教程中只使用命令列方式彙編連線,也不使用nmake工具。

三、ansi字符集api與unicode字符集api

win32 api中凡是與字元有關的api都有兩種不同的型別:ansi字符集api和unicode字符集api,分別對應ansi字元和unicode字元,windows nt支援兩種型別的api,windows 95/98只支援ansi字符集api。在windows.h標頭檔案和其他win32 api定義

標頭檔案中,凡是與字元有關的api都有兩種不同的定義,ansi字符集api以api名稱加字元「a」表示,unicode字符集api以api名稱加字元「w」表示,並使用條件編譯和巨集定義實現自動根據當前字符集使用對應的api定義,例如getmodulehandle函式的定義(包括在winbase.h標頭檔案中):

winbaseapi hmodule winapi getmodulehandlea( lpcstr lpmodulename ); winbaseapi hmodule winapi getmodulehandlew( lpcwstr lpmodulename ); #ifdef unicode #define getmodulehandle getmodulehandlew #else #define getmodulehandle getmodulehandlea #endif // !unicode

與字元有關的資料結構也有類似的定義。本教程考慮到組合語言使用條件彙編會導致不太直觀,全部使用ansi字符集api,這樣也可以保證在windows 95/98和windows nt環境下的相容性,所以本教程中許多api名稱和資料結構的名稱都加有「a」字元,讀者可以方便地改用unicode字符集api。

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

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

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

回憶了一下組合語言的專案,通過寫乙個 windows 程式,程式執行時將彈出乙個訊息框並顯示 assembly is great 來回憶windows api的使用方法。kernel32.dll中的函式主要處理記憶體管理和程序排程 user32.dll中的函式主要控制使用者介面 gdi32.dll中...

Win32彙編基礎

常用指令 mov 目標運算元,源運算元 mov eax,0x0 進行資料傳遞 movzx mov zero x 以0填充高位,用法同上,push poppushad 所有暫存器壓棧 8個 popad 所有暫存器出棧 8個 lea 取位址指令,類似c語言中的 call 呼叫函式指令 add 加 sub...