1,安装masm32,并设置环境变量:
@echo
off
set Masm32Dir = E: / masm32
set include = %Masm32Dir% / Include ; %include% ; D: / dyk / vc6 / Include ; D: / dyk / vc6 / MFC / Include
set lib = %Masm32Dir% / lib ; %lib%
set path = %Masm32Dir% / Bin ; %Masm32Dir% ; % PATH %
echo on
set Masm32Dir = E: / masm32
set include = %Masm32Dir% / Include ; %include% ; D: / dyk / vc6 / Include ; D: / dyk / vc6 / MFC / Include
set lib = %Masm32Dir% / lib ; %lib%
set path = %Masm32Dir% / Bin ; %Masm32Dir% ; % PATH %
echo on
再将VC6.0下的nmake.exe拷贝到Masm32的bin目录下.
2,编写代码:
.
386
.model flat,stdcall
option casemap: none
; 引入头文件
include windows. inc
include user32. inc
includelib user32.lib
include kernel32. inc
includelib kernel32.lib
; 数据段
.data
szCaption db ' Info ' , 0 ; 标题
szText db ' Hello,World! ' , 0 ; 信息内容
; 代码段
.code
start:
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK ; 打印"Hello,World"
invoke ExitProcess,NULL ; 结束当前进程
end start
.model flat,stdcall
option casemap: none
; 引入头文件
include windows. inc
include user32. inc
includelib user32.lib
include kernel32. inc
includelib kernel32.lib
; 数据段
.data
szCaption db ' Info ' , 0 ; 标题
szText db ' Hello,World! ' , 0 ; 信息内容
; 代码段
.code
start:
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK ; 打印"Hello,World"
invoke ExitProcess,NULL ; 结束当前进程
end start
3,进入代码目录,用nmake编译程序,出现下面的错误:
这是因为还没有MAKEFILE,所以无法进行编译,拷贝一个 MAKEFILE修改如下:
EXE
=
Hello
.
exe
#
指定输出文件
OBJS = Hello . obj # 需要的目标文件
LINK_FLAG = / subsystem :windows # 连接选项
ML_FLAG = / c / coff # 编译选项
$( EXE ) : $( OBJS ) $( RES )
Link $( LINK_FLAG ) $( OBJS ) $( RES )
. asm . obj:
ml $( ML_FLAG ) $<
. rc . res:
rc $<
clean:
del * . obj
del * . res
OBJS = Hello . obj # 需要的目标文件
LINK_FLAG = / subsystem :windows # 连接选项
ML_FLAG = / c / coff # 编译选项
$( EXE ) : $( OBJS ) $( RES )
Link $( LINK_FLAG ) $( OBJS ) $( RES )
. asm . obj:
ml $( ML_FLAG ) $<
. rc . res:
rc $<
clean:
del * . obj
del * . res
因为没有用到资源文件,所以RES这一项没有,再次用nmake进行编译:
目录下生成如下图:
运行Hello.exe,即完成第一个”Hello,World”了,
对于这个代码有一个问题我还不大清楚,.inc文件和.lib文件的区别是什么?我个人理解.inc是变量和函数的声明,而.lib是静态链接库,包含着函数的具体实现,再有一个感觉就是MAKEFILE的书写也是一门学问。。
代码重新封装下:
.
386
.model flat,stdcall
option casemap: none
; 引入头文件
include windows. inc
include user32. inc
includelib user32.lib
include kernel32. inc
includelib kernel32.lib
; 数据段
.data
szCaption db ' Info ' , 0
szText db ' Hello,World! ' , 0
.data?
szBuffer db 1024 dup (?) ; 1K的缓冲区
; 代码段
.code
; 打印子程序,标题和文本通过eax,ebx分别传进来
PrintInfo proc
invoke MessageBox,NULL,eax,ebx,MB_OK ; 打印"Hello,World"
ret
PrintInfo endp
start:
mov eax,offset szText ; eax中存放“文本”的地址
mov ebx,offset szCaption ; ebx中存放“标题”的地址
call PrintInfo
invoke ExitProcess,NULL ; 结束当前进程
end start
.model flat,stdcall
option casemap: none
; 引入头文件
include windows. inc
include user32. inc
includelib user32.lib
include kernel32. inc
includelib kernel32.lib
; 数据段
.data
szCaption db ' Info ' , 0
szText db ' Hello,World! ' , 0
.data?
szBuffer db 1024 dup (?) ; 1K的缓冲区
; 代码段
.code
; 打印子程序,标题和文本通过eax,ebx分别传进来
PrintInfo proc
invoke MessageBox,NULL,eax,ebx,MB_OK ; 打印"Hello,World"
ret
PrintInfo endp
start:
mov eax,offset szText ; eax中存放“文本”的地址
mov ebx,offset szCaption ; ebx中存放“标题”的地址
call PrintInfo
invoke ExitProcess,NULL ; 结束当前进程
end start