您的位置:首页 > 其它

win32汇编环境搭建以及第一个程序

2017-09-04 20:38 525 查看
首先下载编译器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如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐