下载MASM32
地址:http://www.masm32.com/
MASM32并不是微软官方发布的软件,是国外的MASM爱好者自行整理和编写的一个软件包,最高版本为11.0版,另外下载了MASM32 ,还要下载一个开发工具RadASM,RadASM下不下载都行,如果没有,需要我们手动编译(ml)、链接(exe)。有了RadASM,可以一键编译、链接、运行。
注意的是,MASM32 安装只能安装在某个盘的根目录,我第一次安装在某个目录下,貌似在编译时会报错,具体记不清了。
Hello Word
.386
.model flat, stdcall
option casemap:none
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\user32.lib
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
system PROTO C:ptr sbyte,:vararg
printf PROTO C:ptr sbyte,:vararg
.data
szTitle BYTE 'hello', 0
szText BYTE 'Hello World', 13,10,0
fmt BYTE '%s',0
szPause BYTE 'pause',0
.code
start:
invoke printf ,ADDR szText,ADDR fmt
invoke MessageBox, NULL, offset szText, offset szTitle, MB_OK
invoke system,ADDR szPause
end start
运行效果:
程序解释
.386
是一个汇编语言伪指令,告诉编译器我们的程序是使用80386指令集编写的,还可以使用 .486、.586, 但最安全的还是使用.386。.model
是用来指定内存模式的伪指令,在Win32下,只有一种内存模型,那就是flat。stdcall告诉编译器参数的传递约定,stdcall表示函数即子程序调用时,实参入栈顺序是从右到左。最后一句是表示标识符区分大小写
.386
.model flat, stdcall
option casemap:none
- includelib和include负责引入要使用的库文件和头文件。
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\user32.lib
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
- 汇编语言中要调用外部的函数(子程序),如C函数,就必须进行函数原型声明,其声明的格式有两种,使用PROTO和EXTRN。
system PROTO C:ptr sbyte,:vararg
printf PROTO C:ptr sbyte,:vararg
.data
中包括已初始化的数据。
.data
szTitle BYTE 'hello', 0
szText BYTE 'Hello World', 13,10,0
fmt BYTE '%s',0
szPause BYTE 'pause',0
输出时通过invoke调用printf函数,参数是szText、fmt,ADDR表示取地址,ADDR szText表示取szText的地址。
然后在调用API MessageBox,用来弹出一个对话框,显示Hello World。
end
上面这段是用来标识代码范围的标签, 两个标签必须相同,应用程序的所有可执行代码必修在两个标签之间。
.code
start:
invoke printf ,ADDR szText,ADDR fmt
invoke MessageBox, NULL, offset szText, offset szTitle, MB_OK
invoke system,ADDR szPause
end start
命令行编译、链接、运行
如果我们使用IDE,不需要我们在命令行进行繁琐、重复的工作,但是要进行学习,这些命令和参数还是要了解下的,在下载Masm32后,把他加入系统环境变量,注意是bin目录,然后cmd进入存放源文件asm下,通过ml进行编译,不出意外会生成一个obj文件。
ml /c /coff MasmDemo.Asm
在进行链接,生成exe,控制台程序一定要指定 /subsystem:console 。
link /subsystem:console MasmDemo.obj
最后输入MasmDemo.exe运行程序。
MasmDemo.exe