一、一些基本定义:
.386 ;表明需要使用386的CPU指令,也可以是.586等,若要使用Pentium MMX指令,在下一行添加.mmx申明。
.model flat,stdcall;flat:平坦内存模式,传参方式为WIN API模式。
.option casemap:none;源码区分大小写,因为WIN API是区分大小写的,因此这句声明是必须的。
.stack ;定义栈段,而在Win中栈是操作系统划分的,所以一般不定义。
.data;数据段,定义全局变量,此处定义的数据将被编译在可执行文件中。
.data?;数据段,定义全局变量,此处定义的数据不被编译,而在运行时动态存取。
.code;代码段
一个最简单的程序结构大致如下:
.386
.model:flat,stdcall
.option:casemap
include xxx.inc
includelib xxx.lib
.data
szTitle db ‘Title,here.’,0
szNumber dw 1,2,3,4
.data?
szGrid db 1024 dup(?)
.code
main:;program form here to start.
;...............
endp main
调用API:
1、winapi使用栈传递参数,其传递顺序为最后一个参数最先压入栈中。
2、call指令调用api。
3、使用MASM伪指令调用api:invoke 函数名 参数1,参数2,……
函数定义声明:
函数名 proto 参数1,参数2,……
子程序定义:
子程序名 proc
local 局部变量名:变量类型
……
子程序名 endp
标号定义:标号代表一段代码的起始位置。
标号名: 目的指令。
@@标号:当需要一个小跳转时(例如判断),可以使用@@作为标号名,在代码中使用@B向当前位置之前最近的@@标号跳转;@F向当前位置之后的最近一个@@标号跳转。
栈:
x86系列的栈是向下增长,栈顶在低地址处,栈底在高地址处。