Win32彙編基本程式設計框架

2021-10-09 10:26:01 字數 2200 閱讀 6808

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 以兩個位...