第一個win32組譯工具 基本概念
WIN32 程式運行在保護模式下的,Windows 把每一個 Win32 應用程式放到分開的虛擬位址空間中去運行,也就是說每一個應用程式都擁有其相互獨立的 4GB 地址空間,作業系統將會在應用程式運行時完成 4GB 的虛擬位址和實體記憶體地址間的轉換,和 16 位 Windows 下的把代碼分成 DATA,CODE 等段的記憶體模式不同,WIN32 只有一種記憶體模式,即 FLAT 模式,所有的 WIN32 的應用程式運行在一個連續、平坦、巨大的 4GB 的空間中。這同時也意味著您無須和段寄存器打交道,您可以用任意的段寄存器定址任意的地址空間,這使得用32位組合語言和用C語言一樣方便。
在Win32下編程,有許多重要的規則需要遵守。有一條很重要的是:Windows 在內部頻繁使用 ESI,EDI,EBP,EBX 寄存器,而且並不去檢測這些寄存器的值是否被更改,這樣當您要使用這些寄存器時必須先儲存它們的值,待用完後再恢複它們,一個最顯著的應用例子就是 Windows 的 CallBack 函數中。
.386 ;告訴編譯器我們的程式是使用80386指令集編寫的 也可以用.486 .586 不過386最安全。
.MODEL Flat, STDCALL ;指定記憶體模式 ,參數傳遞模式和調用函數時由誰來恢複堆棧(調用者還是函數)
.DATA ;注意win32沒有段(sectionment)的概念,不過可以把程式分成不同的分段 只有兩種data和code
<Your initialized data> ;data分段分3種 .data已初始化的資料
......
.DATA?; 未初始化的資料
<Your uninitialized data>
......
.CONST; 常量定義
<Your constants>
......
.CODE ;代碼分段
<label> ;是用來唯一標識您的代碼範圍的標籤,兩個標籤必須相同,應用程式的所有可執行代碼必修在兩個標籤之間。
<Your code>
.....
end <label>
分段並不是象在 Dos 下一樣,為不同的段分別指出不同的段寄存器,因為 Windows 下只有一個 4GB 的段,Windows 程式中的分段表現在當程式裝載時,賦予不同的分段不同的屬性,比如說當你的程式載入時,對於 Ring3 程式來說,.code 段是不可寫的,而 .data 段是可寫的,如果你嘗試象在 Dos 下一樣寫自己的代碼部分,你會得到一個藍屏錯誤