Win32彙編教程二 Win32彙編程式的結構和語法 (轉)
Win32彙編教程二 Win32彙編程式的結構和語法 (轉)[@more@]
匯序的結構和語法
--------------------------------------------------------------------------------
Win32ASM的結構和語法
讓我們先來看看一個最簡單的Win32程式:
.386
.model flat, stdcall
option casemap :none ; case sensitive
include .inc
include kernel32.inc
includelib kernel32.lib
.data
szCaption 'Win32彙編例子',0
szText db 'Win32彙編,Simple and powerful!',0
.code
start:
invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
invoke ExitProcess,NULL
end start
這就是一個能的最簡單的Win32彙編程式,下面我簡單地介紹一下各部分的作用:
.386
這條語句和Dos下彙編是一樣的,是告訴我們要用到80386的指令集,因為32位彙編程式要用到32位的暫存器如eax,ebx等,所以這一句是必須的,當然,你也可以用.486,.586等,當用到特權指令時,還可以用 .386p,.486p等等。
.model flat,stdcall
.model告訴編譯器程式的,編過Dos彙編的人可能知道在Dos程式的模式有tiny,small,...huge 等,它指定了程式定址模式,在huge等模式下,記憶體定址和子程式將用Far的格式,但在Win32彙編中,你只能使用一個模式即 flat 模式,因為對Win32程式來說,記憶體是連續的一個4GB的段,無所謂小或大的模式。而stdcall 告訴編譯器引數的傳遞方式,在呼叫子程式時,引數是透過堆疊傳遞的,引數的傳遞方式有三種,stdcall,c 和 pascal,stdcall 指定了引數是從右到左壓入堆疊的,比如說對一個Windows 如 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
);
那麼在彙編中我們就可以這樣呼叫它:
push uType
push lpCaption
push lpText
push hWnd
call MessageBox
大家要注意最右面的引數是最後一個進堆疊的,當然,我們不必這樣麻煩的呼叫一個 API,因為Masm中的一個宏語句不但幫助我們完成了所有的壓棧操作,還幫我們檢查引數的個數是否正確,那就是 invoke 語句,我們可以把上面的語句換成 invoke MessageBox,hWnd,lpText,lpCaption,uType 就行了。如本程式中代入實際引數就成了 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK。
include 語句
include 語句包含了一些的定義和API函說明,其中所有的Windows 資料結構定義和常量定義包含在 windows.inc 中,而其他 API的說明包含在 xxx.inc 中, 如查 Win32 Programmer's Reference 知道 ExitProcess包含在kernel32.dll 中,那麼我們就要在程式中包括 include kernel32.inc 和 includelib kernel32.lib語句,否則在編譯時會出現 API 函式未定義的錯誤。而 MessageBox 在 user32.dll 中,那麼我們就要在程式中包括 include user32.inc 和 includelib user32.lib語句
.data 或 .data?
指明瞭接下來是資料段,.data 定義了預定義的變數,.data?定義了未初始化的變數,兩者的不同之處是 .data? 定義的變數並不佔用 .exe 的大小,而是在程式執行時動態分配,所以開始是不指定初始值的資料可以放在 .data? 段中,如一個1K大小的緩衝區,放在 .data?中,程式將不會增加一個位元組。
.code
指明瞭接下來是程式碼段,我們的所有程式碼都放在這裡。最後的一句 start 語句指定了程式開始執行的語句。程式中的 ExitProcess 是一個標準的 Win32 API,對應 Dos彙編中的 int 20h 或 mov ah,4ch/int 21h,也就是程式退出。而 MessageBox 也是一個標準的 API,功能是在螢幕上顯示一個訊息框,具體的引數上面已經解釋過了還有要注意的是 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK 語句中, MB_OK 和 NULL 已經預定義在 Windows.inc 中。
匯序的結構和語法
--------------------------------------------------------------------------------
Win32ASM的結構和語法
讓我們先來看看一個最簡單的Win32程式:
.386
.model flat, stdcall
option casemap :none ; case sensitive
include .inc
include kernel32.inc
includelib kernel32.lib
.data
szCaption 'Win32彙編例子',0
szText db 'Win32彙編,Simple and powerful!',0
.code
start:
invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
invoke ExitProcess,NULL
end start
這就是一個能的最簡單的Win32彙編程式,下面我簡單地介紹一下各部分的作用:
.386
這條語句和Dos下彙編是一樣的,是告訴我們要用到80386的指令集,因為32位彙編程式要用到32位的暫存器如eax,ebx等,所以這一句是必須的,當然,你也可以用.486,.586等,當用到特權指令時,還可以用 .386p,.486p等等。
.model flat,stdcall
.model告訴編譯器程式的,編過Dos彙編的人可能知道在Dos程式的模式有tiny,small,...huge 等,它指定了程式定址模式,在huge等模式下,記憶體定址和子程式將用Far的格式,但在Win32彙編中,你只能使用一個模式即 flat 模式,因為對Win32程式來說,記憶體是連續的一個4GB的段,無所謂小或大的模式。而stdcall 告訴編譯器引數的傳遞方式,在呼叫子程式時,引數是透過堆疊傳遞的,引數的傳遞方式有三種,stdcall,c 和 pascal,stdcall 指定了引數是從右到左壓入堆疊的,比如說對一個Windows 如 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
);
那麼在彙編中我們就可以這樣呼叫它:
push uType
push lpCaption
push lpText
push hWnd
call MessageBox
大家要注意最右面的引數是最後一個進堆疊的,當然,我們不必這樣麻煩的呼叫一個 API,因為Masm中的一個宏語句不但幫助我們完成了所有的壓棧操作,還幫我們檢查引數的個數是否正確,那就是 invoke 語句,我們可以把上面的語句換成 invoke MessageBox,hWnd,lpText,lpCaption,uType 就行了。如本程式中代入實際引數就成了 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK。
include 語句
include 語句包含了一些的定義和API函說明,其中所有的Windows 資料結構定義和常量定義包含在 windows.inc 中,而其他 API的說明包含在 xxx.inc 中, 如查 Win32 Programmer's Reference 知道 ExitProcess包含在kernel32.dll 中,那麼我們就要在程式中包括 include kernel32.inc 和 includelib kernel32.lib語句,否則在編譯時會出現 API 函式未定義的錯誤。而 MessageBox 在 user32.dll 中,那麼我們就要在程式中包括 include user32.inc 和 includelib user32.lib語句
.data 或 .data?
指明瞭接下來是資料段,.data 定義了預定義的變數,.data?定義了未初始化的變數,兩者的不同之處是 .data? 定義的變數並不佔用 .exe 的大小,而是在程式執行時動態分配,所以開始是不指定初始值的資料可以放在 .data? 段中,如一個1K大小的緩衝區,放在 .data?中,程式將不會增加一個位元組。
.code
指明瞭接下來是程式碼段,我們的所有程式碼都放在這裡。最後的一句 start 語句指定了程式開始執行的語句。程式中的 ExitProcess 是一個標準的 Win32 API,對應 Dos彙編中的 int 20h 或 mov ah,4ch/int 21h,也就是程式退出。而 MessageBox 也是一個標準的 API,功能是在螢幕上顯示一個訊息框,具體的引數上面已經解釋過了還有要注意的是 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK 語句中, MB_OK 和 NULL 已經預定義在 Windows.inc 中。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987438/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基本概念(win32)彙編教程(轉)Win32
- Win32彙編教程十二 管道操作 (轉)Win32
- win32下彙編程式碼結構學習Win32
- Win32彙編的環境和基礎(轉)Win32
- Win32彙編的環境和基礎 (轉)Win32
- Win32彙編教程八 圖形介面的操作 (轉)Win32
- Win32彙編教程十 定時器的應用 (轉)Win32定時器
- Win32彙編教程四 編寫一個簡單的視窗 (轉)Win32
- Win32彙編教程七 控制元件的子類化 (轉)Win32控制元件
- Jack's第一個Win32彙編程式HelloWorldWin32
- Jack架設WIN32彙編程式的開發環境Win32開發環境
- Jack整理的Win32彙編基礎知識Win32
- iOS彙編入門教程(二)在Xcode工程中嵌入彙編程式碼iOSXCode
- iOS逆向之旅(基礎篇) — 彙編(二) — 彙編下的 IF語句iOS
- Billy Belceb 病毒編寫教程for Win32 ----Win32優化Win32優化
- Billy Belceb 病毒編寫教程for Win32 ----Win32多型Win32多型
- Win32彙編教程三 一個簡單的對話方塊 --- 兼談資原始檔的使用 (轉)Win32
- Go彙編語法和MatrixOne使用介紹Go
- Billy Belceb 病毒編寫教程for Win32 ----Win32 反除錯Win32除錯
- 學習筆記分享之彙編---2.彙編指令/語法筆記
- Iczelion 的 Win32Asm VxD 彙編教程 (二) (轉)Win32ASM
- Billy Belceb 病毒編寫教程for Win32 ----高階Win32技術Win32
- win32下vs2013彙編傳參和區域性變數棧的分配Win32變數
- Billy Belceb 病毒編寫教程for Win32 ----附錄Win32
- WIN32 手動編譯Win32編譯
- iOS彙編入門教程(一)ARM64彙編基礎iOS
- 彙編跳轉指令
- iOS彙編入門教程(三)彙編中的 Section 與資料存取iOS
- iOS逆向之旅(基礎篇) — 彙編(三) — 彙編下的 Switch語句iOS
- 學 Win32 彙編[28] - 跳轉指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等Win32JS
- 彙編程式碼Helloworld
- 彙編debug程式跳轉指令的方法
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- shellcode轉換成彙編程式碼
- Iczelion 的 Win32Asm VxD 彙編教程 (四) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (三) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (七) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (六) (轉)Win32ASM