由于前面的内容涉及基础比较多,所以个人认为还是把基础打好,就整理一下当作复习。
3.11 定义模式
在程序的第一部分,定义语句:
.386
.model flat,stdcall
option casemap:none
作用:定义了程序使用的指令集,工作模式和格式。
1. 指定使用的指令集
.386 用于告诉编译器在本程序中使用的指令集。后面带P的伪指令则表示程序中可以使用特权指令。
附:Pentium MMX开始增加了MMX指令集,除了定义 .586 外,还要加 .mmx
2. .model语句
作用:用来定义程序工作的模式,使用方法:
.model 内存模式[,语言模式] [,其他模式]
内存模式:我们一般使用 flat (Win32程序使用的模式,代码和数据段使用同一个4GB段)
语言模式:即子程序的调用方式。 Stdcall 指出了调用子程序或Win32 API时 参数传递的次序和堆栈平衡的方法。
3.option 语句
用option语句定义的选项有很多,我们在win32程序中,只需定义 option casemap:none 这个语句定义了程序中的变量和子程序名是否对大小写敏感.
3.1.2 段的定义
1.段的概念
Win32汇编源程序中“分段”的概念实际上是把不同类型的数据或代码归类,再放到不同属性的内存页(也就是不同的“分段”)中,这中间不涉及使用不同的段选择器。
2. 数据段
.data 可读可写的已定义变量 。一般存放在_DATA节区。
.data? 可读可写未定义变量。一般存放_BSS节区。
.const 数据是一些常量。如果对.const段中的数据做了写操作的指令,会引起保护错误。(.code段也是可以读)
3. 代码段
所有的指令都必须写在代码段中,在可执行文件中,代码段一般是放在_TEXT节区中。Win32环境中的数据段不可执行,只有代码段有可执行的属性。对于工作在特权3的应用程序来说,(.code)段是不可写的。
4. 堆栈段
值得一提:堆栈段的内存属性是可读可写并且可以执行。
3.1.3程序结束和程序入口
End [开始地址]
End start
3.1.4 注释和换行
用分号(;)注释可以在一行的头部,也可以在一行的中间。
3.2 调用API
应用程序调用系统功能的一般过程:1)系统提供功能模块并约定参数的定义方法,同时约定调用的方式,应用程序按照这个约定来调用系统功能。
Win32的系统功能模块放在Windows的动态连接库(DLL)中,DLL是一种Windows的可执行文件,采用和.exe文件同样的PE格式
Win32 API 的核心由3个DLL提供:
1) KERNEL32.DLL ——系统服务功能。包括内存管理,任务管理和动态链接等。
2) GDI32.DLL——图形设备接口。利用VGA和DRV之类的显示设备驱动程序完成显示文本和矩形等功能。
3) USER32.DLL——用户接口服务。建立窗口和传送消息等。