程式結束和程式入口
在win32中如果是只編寫單個模組,那麼可以像8086彙編一樣:start : ......
end start
如果編寫多個模組的話按之前的8086彙編,那麼每個模組都要加個入口位址,但是現在的win32彙編可以也必須只在乙個主模組指定入口位址,然後這個主模組最後的end要加上入口位址,而其他的模組不能在最後的end後加上入口位址,否則會報錯。
注釋和換行
注釋一樣也是分號後面的是注釋,然後換行就是加一根斜槓:'\' 。比如 invoke messagebox,\
null,\
就是在要換行的地方加乙個 :' \ '。
呼叫api
在以前的dos 環境中,要實現作業系統的各種功能都是通過各種中斷來實現的,到了win32環境中我們就可以像呼叫函式一樣呼叫
作業系統中的一些功能,也就是api函式,不僅我們寫的win32環境要呼叫api函式,windows系統本身也要呼叫這些函式,比如顯示乙個視窗什麼的。
而這些功能模組,也就是這些api函式都被放在乙個叫windows動態鏈結庫的檔案裡面了,這個檔案也叫dll。dll也是一中windows可執行檔案,它採用和.exe一樣的pe結構,它把能提供呼叫的函式列表用字串的形式放在pe檔案頭部的匯出表中。應用程式在被使用或者在執行的時候windows系統會自動將dll裝入並呼叫相應的函式。
實際上 win32的基礎就是由dll組成的,win32api有很多函式,其中win32api核心由三個dll組成,它們就是:
那麼,在我們現在的win32彙編中如何來呼叫這些api函式呢,其實就像c++呼叫函式一樣,我們要指定函式名,然後還要傳遞一些引數,要注意的是我們傳遞引數使用的方法是堆疊傳遞,有乙個先進後出的原則,所以,比如messagebox的函式宣告長這樣的話:
int messagebox{
hwnd hwnd, //hwnd型別的視窗控制代碼
lpctstr lptext, //要顯示的內容的位址
lpctstr lpcaption, //要顯示的標題的位址
uint utype //訊息框型別
那麼如果我們要呼叫這個函式,我們就應該先向棧裡面壓入引數,並且引數的順序要和上面的順序相反,因為引數在棧中是先進後出的,我們將引數反順序壓入棧後,函式取出引數時正好會是正方向。壓入引數後我們就呼叫函式。具體操作如下:
push utype
push lpcaption
push lptext
push hwnd
call messagebox
上面的mssagebox函式宣告只是這個messagebox函式的一部分,在這個函式的最後還有乙個說明:library: use user32.lib.
這一句說明了這個函式包含在user32.dll中。
在我們的源程式被編譯成可執行檔案之後,我們那個call messagebox ,中的messagebox會被換成乙個位址,但這還不是我們最後的api的位址,這個位址指向可執行檔案中的匯入表,匯入表又指向許多api函式的實際記憶體位址,然後在程式裝入記憶體的時候,匯入表中指向messagebox函式的實際記憶體位址會根據user32.dll在記憶體中的位置由系統自動填入。也就是說我們一開始寫入的messagebox類似於乙個c++中指標的指標,它指向匯入表,匯入表才指向最後api函式的實際記憶體位址,而這個實際記憶體位址是由系統在程式裝入記憶體的時候根據user32.dll在記憶體中的位置自定填入的。
6 程式入口和注釋
在前面的課程中講到了計算機程式執行的模型 資料儲存模型 程式的編譯和執行。大家對電腦程式的編寫到最終執行的過程有乙個簡單的了解。從本章節開始,將會逐步的講到計算機中程式 的編寫規則。本節課講的內容是電腦程式的入口和 的注釋規則。在計算的程式設計中,不管使用何種語言程式設計,程式的入口一般都是叫做主函...
MFC 程式入口和執行流程
一 mfc程式執行過程剖析 相信大家有點暈點了吧,實際程式設計中沒有必要深刻理解這麼多,這些大都是由mfc內部自動幫我們完成的。實際mfc程式設計過程中,其實懂得mfc程式中各個函式的執行流程即可。有時候過於追究mfc細節會白白浪費我們的精力,應該將主要精力放在使用mfc解決實際問題上。二 vc6中...
MFC 程式入口和執行流程
一 mfc程式執行過程剖析 6 在訊息執行結束,使用者按下關閉按鈕後,作業系統向程式傳送wm close訊息,預設狀況下程式呼叫destorywindow並且傳送wm destory訊息,應用程式接受到這個訊息以後的預設操作是呼叫postquitmessage函式,由這個函式傳送wm quit訊息。...