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

来源:互联网 发布:mac修改淘宝登录密码 编辑:程序博客网 时间:2024/05/16 17:35

首先下载编译器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 文件定义includewindows.inc;函数声明定义格式:函数名 proto[距离][语言][参数名]:数据类型 参数名]:数据类型includeuser32.incincludelib user32.lib;告诉链接器在链接的时候去指定的库文件找,这是导入库 include kernel32.incincludelib kernel32.lib;数据段.data;定义这些分段是把不同类型的数据或代码归类,放到不同的属性内存页中,dos下定义是赋值给寄存器szCaption db'你好',0szText    db'hello,world !',0;代码段.code;所有指令都必须放在代码段,在可执行文件中,代码段放在_TEXT节区(区块)中)start:invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK;invoke是一个伪指令,用来检查函数参数数量;MessageBox是一个函数,后面四个是参数,1父窗口句柄,2消息框中的文字3标题文字4按钮的状态信息invoke ExitProcess,NULLend start

编写makefile,代码如下,你也可以一步一步编译,命令:ml  /c /coff 编译成obj文件。然后link32 /subsystem:windows 链接生成.exe文件

NAME=helloOBJS=$(NAME).objLINK_FLAG=/subsystem:windowsML_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如下:



阅读全文
0 0