分类: WINDOWS
2008-11-07 17:24:57
框架一:
|
框架二:
|
一..386:汇编语言伪指令,告诉MASM我们要用80386指令集。还可以使用 .486、.586, 但最安全的还是使用.386。
二.. model flat,stdcall:指定内存模式的伪指令,告诉MASM 使用的内存寻址模式,WIN32 只有一种内存模式,即 FLAT 模式,意思是"平坦"的内存模式,再没有64K的段大小限制,所有的 WIN32 的应用程序运行在一个连续、平坦、巨大的 4GB 的空间中。stdcall(可选)告诉MASM我们所用的参数传递约定。STDCALL 告诉编译器参数的传递约定。参数的传递约定是指参数传达时的顺序(从左到右或从右到左)和由谁恢复堆栈指针(调用者或被调用者)。在Win16下有两种约定:C 和 PASCAL。C 约定规定参数传递顺序是从右到左,即最右边的参数最先压栈,由调用者恢复堆栈指针。
三..data?:未初始化变量部分。
四..data:初始化变量部分。
五..CONST 其中包括常量定义。这些常量在程序运行过程中是不能更改的。
六..CODE 代码"分段"。
七.程序执行从start开始,end为结束。
八.应用程序并不需要以上所有的三个"分段",可以根据需要进行定义。
九.
用来唯一标识您的代码范围的标签,两个标签必须相同,应用程序的所有可执行代码必须在两个标签之间。
十.退出 Windows,则必须调用函数 ExitProcess。
十一.函数原型定义:
ExitProcess proto uExitCode:DWORD
定义格式:
FunctionName PROTO [ParameterName]:DataType,[ParameterName]:DataType,……
即函数名后加伪指令PROTO(原型),后面是数据类型链表。
十二.调用函数(用call或invoke)
例:call ExitProcess
或:invoke ExitProcess
十三.调用方法call和invoke的区别。
Call:当忘记把一个DWORD类型参数压入堆栈时,编译器和链接器不会报错,但在程序运行时将引起崩溃。
Invoke:invoke的调用方法比call 安全,即invoke调用会帮忙检查参数是否压栈。Invoke
是一个有参类型检查的调用语句。(推荐使用)
十四.Invoke调用语法
格式:INVOKE expression [,arguments]
1.expression 既可以是一个函数名也可以是一个函数指针。参数由逗号隔开。大多数API函数的原型放在头文件中。
2.头文件在文件夹MASM32/include下, 这些头文件的扩展名为INC,函数名和 DLL 中的函数名相同。
例:KERNEL32.LIB 引出的函数 ExitProcess的函数原形声明于kernel.inc中。
调用语句:invoke ExitProcess,0