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汇编示例;

Win32汇编基本编程框架_第1张图片

要先保存为.asm文件才能构建;.asm文件保存在masm32目录下,非bin目录下,masm32环境自己处理;

Win32汇编基本编程框架_第2张图片

程序啥也不干,调用 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

你可能感兴趣的:(汇编语言,.386,.model,指令集,内存模式,堆栈平衡的方法)