Win32汇编基本编程框架
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:noneinclude 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錯誤見此:
? ??https://blog.csdn.net/bcbobo21cn/article/details/108494279
總結
以上是生活随笔為你收集整理的Win32汇编基本编程框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Union 和 Union Al
- 下一篇: WPF 3d坐标系和基本三角形