win32彙編程式設計框架如下;
.386
.model flat,stdcall
option casemap:none
《一些include語句》
.stack [堆疊段的大小]
.data
《一些初始化過的變數定義》
.data?
《一些沒有初始化過的變數定義》
.const
《一些常量定義》
.code
《**》
《開始標號》
《其它語句》
end 開始標號
開頭幾句解釋如下;
指令集
.386 語句是彙編語句的偽指令,類似指令有:.8086 、 .186 、.286 、.386/.386p 、 .486/.486p 和 .586/.586p 用於告訴編譯器在本程式中使用的指令集。
後面帶p的偽指令則表示程式中可以使用特權指令,如:mov cr0,eax 這一類指令必須在特權極0上執行。
如果我們要寫的程式是vxd等驅動程式,中間要用到特權指令,那麼必須定義.386p ,在應用程式級別的win32程式設計中,程式都是執行在優先順序3上,不會用到特權指令,只需定義 .386就夠了。
如果程式要用到80486處理器 或 pentium處理器的指令,則必須定義 .486 或 .586。
如果使用了mmx指令,除了定義 .586之外,還要 .mmx偽指令。
其它一些簡單程式,.386就可以了。
.model 語句 模式定義
.model 記憶體模式 [,語言模式] [,其它模式] (用中括號括起來的是可選)
記憶體模式的定義影響最後生成的可執行檔案,執行檔案的規模從小到大,可以很多態別。
語言模式即子程式呼叫方式,它指出了呼叫子程式或win32 api時引數傳遞的次序和堆疊平衡的方法。
_ stdcall呼叫——是pascal程式的預設呼叫方式,引數採用從右到左的壓棧方式(倒序壓入),被呼叫函式 自身在返回前清空堆疊。win32 api 都採用這種呼叫方式。
_cdecl 呼叫 ——是c/c++的預設呼叫方式,引數從右到左的壓棧方式,呼叫者 清空堆疊。 所以產生的可執行檔案大小會比呼叫_stdcall函式大。
option 語句
option casemap:none 的意義是告訴編譯器程式中變數名和子程式名是否對大小寫敏感。 none 對大小寫敏感。
win32 api的函式名稱本質是區分大小寫的,所以必須指定這個選項。
下面是最基本win32彙編示例;
要先儲存為.asm檔案才能構建;.asm檔案儲存在masm32目錄下,非bin目錄下,masm32環境自己處理;
程式啥也不幹,呼叫 exitprocess 直接退出;
.386
.model flat,stdcall
option casemap:none
include s:\masm32\include\windows.inc
include s:\masm32\include\kernel32.inc
includelib s:\masm32\lib\kernel32.lib
.data
.code
start:
invoke exitprocess,0
end start
.model flat,stdcall
這句如果把逗號半形寫成全形,將出現錯誤:
error a2119: language type must be specified
invoke exitprocess,0
這句如果把逗號半形寫成全形,將出現錯誤:
error a2044: invalid character in file
option casemap:none
這句如果把冒號半形寫成全形,將出現如下面多個錯誤:
windows.inc(156) : error a2004: symbol type conflict : bool
a2004錯誤見此:
Win32彙編基礎
常用指令 mov 目標運算元,源運算元 mov eax,0x0 進行資料傳遞 movzx mov zero x 以0填充高位,用法同上,push poppushad 所有暫存器壓棧 8個 popad 所有暫存器出棧 8個 lea 取位址指令,類似c語言中的 call 呼叫函式指令 add 加 sub...
Win32彙編 實數
386 選擇的處理器 model flat,stdcall option casemap none 指明識別符號大小寫敏感 include kernel32.inc 要引用的標頭檔案 includelib kernel32.lib 要引用的庫檔案 includelib msvcrt.lib 引用c庫...
Win32程式設計
win32 malloc函式的底層實現是win32api utf 16編碼以16位無符號整數為單位,注意是16位為乙個單位,不是乙個字元就只有16位,這個要看字元的unicode編碼處於什麼範圍而定,有可能是2個位元組,也可能是4個位元組現在機器上的unicode編碼一般就是指utf 16 以兩個位...