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错误见此:
https://blog.csdn.net/bcbobo21cn/article/details/108494279