Win32汇编学习笔记(一)

本文介绍了使用MASM32在Windows环境下编写并编译汇编语言程序的过程,包括环境搭建、编写示例代码、编译及运行等步骤,并探讨了.inc与.lib文件的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,安装masm32,并设置环境变量:

None.gif@echooff
None.gif
setMasm32Dir=E:/masm32
None.gif
setinclude=%Masm32Dir%/Include;%include%;D:/dyk/vc6/Include;D:/dyk/vc6/MFC/Include
None.gif
setlib=%Masm32Dir%/lib;%lib%
None.gif
setpath=%Masm32Dir%/Bin;%Masm32Dir%;%PATH%
None.gif
echoon
None.gif
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

再将VC6.0下的nmake.exe拷贝到Masm32bin目录下.

2,编写代码:

None.gif.386
None.gif.modelflat,stdcall
None.gifoption
casemap:none
None.gif
None.gif
;引入头文件
None.gif
includewindows.inc
None.gifincludeuser32.
inc
None.gifincludelibuser32.lib
None.gifincludekernel32.
inc
None.gifincludelibkernel32.lib
None.gif
None.gif
;数据段
None.gif

None.gif.data
None.gifszCaptiondb
'Info',0;标题
None.gif
szTextdb'Hello,World!',0;信息内容
None.gif

None.gif
;代码段
None.gif

None.gif.code
None.gif
start:
None.gifinvokeMessageBox,NULL,offsetszText,offsetszCaption,MB_OK
;打印"Hello,World"
None.gif
invokeExitProcess,NULL;结束当前进程
None.gif
endstart
None.gif


3,进入代码目录,用nmake编译程序,出现下面的错误:
2008030602.jpg


这是因为还没有MAKEFILE,所以无法进行编译,拷贝一个MAKEFILE修改如下:

None.gifEXE=Hello.exe#指定输出文件
None.gifOBJS
=Hello.obj#需要的目标文件
None.gif
None.gifLINK_FLAG
=/subsystem:windows#连接选项
None.gifML_FLAG
=/c/coff#编译选项
None.gif
None.gif
$(EXE):$(OBJS)$(RES)
None.gifLink
$(LINK_FLAG)$(OBJS)$(RES)
None.gif
None.gif
.asm.obj:
None.gifml
$(ML_FLAG)$<
None.gif
.rc.res:
None.gifrc
$<
None.gif
None.gifclean:
None.gif
del*.obj
None.gif
del*.res
None.gif

因为没有用到资源文件,所以RES这一项没有,再次用nmake进行编译:
2008030601.jpg

目录下生成如下图:
2008030604.jpg

运行Hello.exe,即完成第一个”Hello,World”了,
2008030603.jpg


对于这个代码有一个问题我还不大清楚,.inc文件和.lib文件的区别是什么?我个人理解.inc是变量和函数的声明,而.lib是静态链接库,包含着函数的具体实现,再有一个感觉就是

MAKEFILE的书写也是一门学问。。

代码重新封装下:

None.gif.386
None.gif.modelflat,stdcall
None.gifoption
casemap:none
None.gif
None.gif
;引入头文件
None.gif
includewindows.inc
None.gifincludeuser32.
inc
None.gifincludelibuser32.lib
None.gifincludekernel32.
inc
None.gifincludelibkernel32.lib
None.gif
None.gif
;数据段
None.gif

None.gif.data
None.gifszCaptiondb
'Info',0
None.gifszTextdb
'Hello,World!',0
None.gif
None.gif.data?
None.gifszBufferdb
1024dup(?);1K的缓冲区
None.gif

None.gif
;代码段
None.gif
.code
None.gif
None.gif
;打印子程序,标题和文本通过eax,ebx分别传进来
None.gif
PrintInfoproc
None.gifinvokeMessageBox,NULL,eax,ebx,MB_OK
;打印"Hello,World"
None.gif
ret
None.gifPrintInfoendp
None.gif
None.gif
start:
None.gif
moveax,offsetszText;eax中存放“文本”的地址
None.gif
movebx,offsetszCaption;ebx中存放“标题”的地址
None.gif
callPrintInfo
None.gifinvokeExitProcess,NULL
;结束当前进程
None.gif
endstart
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值