首先下载编译器MASM32 SDK软件包:链接:http://pan.baidu.com/s/1eSlaFnG 密码:6ylw
添加环境变量:cmd下进入目录,运行里面的Var.bat目录添加环境变量
测试代码如下:
.386 ;前3句是模式定义 告诉cpu程序使用那个指令集,类似还有.8086/
;.386/.386p (带p的表示可以使用特权指令 例如mov rc0,eax
;这一类的指令必须在特权级0上运行,如果只指定.386,那么使用普通的指令是可以的
;编译时到这一句就会报错)等,win32环境工作在8086之上
.model flat,stdcall ;model用来定义程序工作的模式,它的使用方法:.model 内存模式 [语言模式](stdcall,子程序的调用方法)
;[其他模式] ;内存模式自己查找.flat是win32程序使用的的内存模式(window32只有这一种内存模式),代码数据使用同一个数据段
;stdcall指出了调用子程序/win32 Api 时参数传递的顺序和栈平衡的方法
;-stdcall调用:_stdcall是pascal程序的默认调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空栈区
;_cdecl调用:_cdecl是c/c++的默认调用方式,参数采用从右到左的压栈方式,传送参数的内存栈由调用者维护
;_cdecl约定的函数只能被c/c++调用。每一个调用它的函数都包含清空内存栈的代码。所以可执行文件的大小会比调用_stdcall函数的大一点
option casemap:none ;告诉编译器程序大小写敏感,因为win32API大小写敏感
;include 文件定义
include windows.inc ;函数声明定义格式:函数名 proto [距离][语言][参数名]:数据类型 参数名]:数据类型
include user32.inc
includelib user32.lib ;告诉链接器在链接的时候去指定的库文件找,这是导入库
include kernel32.inc
includelib kernel32.lib
;数据段
.data ;定义这些分段是把不同类型的数据或代码归类,放到不同的属性内存页中,dos下定义是赋值给寄存器
szCaption db '你好',0
szText db 'hello,world !',0
;代码段
.code ;所有指令都必须放在代码段,在可执行文件中,代码段放在_TEXT节区(区块)中)
start:
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK
;invoke是一个伪指令,用来检查函数参数数量
;MessageBox是一个函数,后面四个是参数,1父窗口句柄,2消息框中的文字 3标题文字 4按钮的状态信息
invoke ExitProcess,NULL
end start
编写makefile,代码如下,你也可以一步一步编译,命令:ml /c /coff 编译成obj文件。然后link32 /subsystem:windows 链接生成.exe文件
NAME=hello
OBJS=$(NAME).obj
LINK_FLAG=/subsystem:windows
ML_FLAG=/c /coff
$(NAME).exe:$(OBJS)
link32 $(LINK_FLAG) $(OBJS)
.asm.obj:
ml $(ML_FLAG) $<
clean:
del *.obj
输入命令:nmake (nmake是从vc6IDE中拷贝到masm32中的bin目录下的),生成.exe文件
运行.exe如下: