當前位置:編程學習大全網 - 圖片素材 - win32的結構語法

win32的結構語法

讓我們先來看看壹個最簡單的Win32匯編程序:

.386

.model flat, stdcall

option casemap :none ; case sensitive

include windows.inc  include kernel32.inc  include user32.inc

includelib kernel32.lib  includelib user32.lib

.data

szCaption db '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匯編程序,下面我簡單地介紹壹下各部分的作用: .model告訴編譯器程序的模式,編過Dos匯編的人可能知道在Dos程序的模式有tiny,small,...huge 等,它指定了程序內存尋址模式,在huge等模式下,內存尋址和子程序調用將用Far的格式,但在Win32匯編中,妳只能使用壹個模式即 flat 模式,因為對Win32程序來說,內存是連續的壹個4GB的段,無所謂小或大的模式。而stdcall 告訴編譯器參數的傳遞方式,在調用子程序時,參數是通過堆棧傳遞的,參數的傳遞方式有三種,stdcall,c 和 pascal,stdcall 指定了參數是從右到左壓入堆棧的,比如說對壹個Windows API 如 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。 不管在Dos下編程還是在Windows下編程,我們總是要用到除了可執行文件外的很多其他數據,如聲音數據,圖形數據,文本等等,在Dos下編程,我們可以自己定義這些文件的格式,但這樣壹來就造成了很多資源***享的問題,大家可能還記的Dos下的很多遊戲,它們的圖形都是按自己的格式存放的,妳無法用標準的看圖軟件來看。也無法把它另存為其他格式。雖然在Win32編程中,我們仍然可以這樣做,但Win32編程給了我們壹個方案 ---- 就是格式統壹的資源文件,把字符串、圖形、對話框包括上面的按鈕,文本等定義到壹個資源文件中,就可以方便的在不同的文件中使用它,最重要的是,如果我們用自己的文件格式,使用時就要涉及到這些文件的讀寫操作,比較復雜,但使用資源文件時,Windows提供了壹系列的API來裝入資源。非常方便。.rc,當它用資源編譯器編譯以後產生 .res 文件就可以在 link的時候連入.exe 文件中:

#include <Resource.h>

#define DLG_MAIN 1

DLG_MAIN DIALOGEX 0, 0, 236, 185

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

CAPTION 對話框模板

FONT 9, 宋體

BEGIN

DEFPUSHBUTTON 退出,IDOK,177,163,50,14

CONTROL ,-1,Static,SS_ETCHEDHORZ,7,155,222,1

END

.rc文件的語法:

#include <resource.h> -- resource.h文件包括資源文件的壹些常量定義,如下面的 WS_POPUP,WS_VISIBLE 等窗口的風格等等

#define DLG_MAIN 1 -- 類似於 .asm 文件的 equ 語句,和匯編源程序壹樣,這些定義是為了程序的可讀性。

DLG_MAIN DIALOGEX 0,0,236,185

Windows的.rc文件可以定義 BITMAP(位圖),CURSOR(光標),ICON(圖標),ACCELERATORS(加速鍵),DIALOG(對話框),MENU(菜單),STRINGTABLE(字符串表),RCDATA(自定義資源)等8種資源,詳細的描述可以參考有關MFC的書籍,在Win32ASM中的資源編譯器的語法中,壹般格式是這些資源的定義方法是:

位圖定義: nameID BITMAP [load-mem] filename

光標定義: nameID CURSOR [load-mem] filename

圖標定義: nameID ICON [load-mem] filename

加速鍵定義:

acctablename ACCELERATORS [optional-statements]

BEGIN event, idvalue, [type] [options]

. . .

END

等等,具體的定義和參數可以參考 Masm32v5 中的 Rc.hlp 幫助文件。(可以在編程工具中下載),我們可以用資源編輯器來所見即所得地編輯資源,也可以在文本編輯器中用上面這些語句自己定義資源。 在程序中,要使用資源之前必須先裝如內存,Windows定義了壹系列的API來裝入資源,如 LoadMenu,LoadString,LoadBitmap 等等,如 LoadBitmap 的定義:

HBITMAP LoadBitmap(

HINSTANCE hInstance, // handle of application instance

LPCTSTR lpBitmapName // address of bitmap resource name

);

這些Load函數的返回值是壹個句柄,調用參數中壹般至少為兩項: hInstance 和 ResouceName,這個 ResouceName(如BitmapName,MenuName)就是在資源文件中的 #define 指定的值,如果妳用 #define MY_ICON 10/ MY_ICON ICON Main.ico 定義了壹個圖標,那麽在程序中要使用 Main.ico 圖標就可以用 LoadIcon(hInstance,10) 來裝入已經定義為10號的圖標文件。另壹個參數 hInstance 是執行文件的句柄,它對應資源所在的文件名,妳可以在程序開始執行時用 invoke GetModuleHandle,NULL 獲得 hInstance。另外壹些資源並不是顯式地裝入的,如對話框資源,它是在建立對話框的函數中由Windows自己裝入的,如下面例子中的 invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,0 ,是在屏幕上顯示壹個資源文件中已經定義好了的對話框,就並不存在 LoadDialogBox 之類的API來先裝入對話框。

  • 上一篇:2011潮的唯美心情語錄-維也納的憂傷 妳經歷過嗎
  • 下一篇:《庭院深深》“豪門棄婦”章含煙,脫胎換骨歸來,她的逆襲不簡單
  • copyright 2024編程學習大全網