win32初篇-win32可执行文件的开发过程

win32生成可执行文件的步骤

win32汇编要比之前的8086汇编要复杂许多,光是生成可执行文件就多了好多步骤。之前的8086汇编生成可执行文件只需要将写好的汇编程序(.asm)编译,生成目标文件(.obj),然后连接就生成可执行文件(.exe)了。而win32汇编就不一样了,下面来介绍一下具体步骤。

要生成一个win32可执行文件,首先也和8086汇编一样,我们先要在文本编辑器中打出汇编程序(.asm),但是我们不是像8086那样直接编译就生成目标文件了,在win32汇编中,我们所写的汇编程序还需要和头文件(.inc),API声明头文件(.inc)一起通过汇编编译器编译成目标文件.obj  。在win32中头文件都是用inc作扩展名。不过一般编译器软件中会自动把这些头文件加进去。

然后这还没完,我们还需要资源文件(当然,如果你所编写的程序中不需要什么资源文件那么也不一定要这个资源文件),而资源文件又是由资源脚本文件经过资源编译器得来的,资源文件中主要就是包含一些图标,位图,光标,声音之类的东西,所以叫做资源文件。把资源脚本文件编译成资源文件有一些专门的软件,书上推荐使用vs c++6.0里面的一个功能,但目前我还没下这个软件,不过对于目前的学习不碍事。资源脚本文件的后缀名:. rc   资源文件的后缀名:. res 。

最后还有一个导入库文件。首先介绍一下导入库:当我们编译好目标文件和资源文件后,我们就要开始连接了,而如果我们所编写的程序中有调用到一些库函数的时候,如果是DOS环境下,链接器就会从库文件中将这个函数的二进制代码取出,与.obj文件结合在一起形成最终的可执行文件。而在win32汇编中,库文件中存放的是函数在DLL文件中的位置(DLL文件就是动态链接库文件,它对电脑程序的运行很重要,解释起来比较麻烦,就是电脑中的程序可能并不是一个完整的可执行文件,它可能被分割成一段一段地放在电脑中,所以程序运行时就需要这个DLL。win32中,大部分公用函数封装在DLL文件中)。也就是说,链接的时候只把库文件的位置信息取出放入最后的可执行文件中。

上面的过程大概就是下面这张图的样子:

 使用ML.exe,LINK.exe,nmake,makefile

知道了基本步骤之后,就要开始尝试一下编译和连接生成第一个win32可执行文件了。我们用来进行编译生成.obj文件的编译程序是一个叫ml.exe的程序,它包含在一个win32汇编编译器里面,用来连接生成可执行文件的程序是一个叫 link.exe的程序,它也包含在这个软件里面。

因为现在还没有开始学win32汇编语法,所以我现在直接用小甲鱼写的一个源程序来进行编译连接。首先我在那个win32汇编软件里面创建一个文件夹,然后把源文件放在里面:

源文件就是那个Test.asm文件,那么我们要如何用软件进行编译呢?当然也是要进入DOS环境,进入之后打开我们的源文件所在位置:

可以看到我们的源文件在里面。然后我们用ml.exe来进行编译,它的具体用法如下:

ml  /c /coff /Cp test.asm

就是类似于这种形式,/c 表示编译时仅进行编译,不进行连接,/coff 表示生成的 .obj文件是 coff格式,coff格式是PE文件的前身,在win32环境下这个coff是必填的。/Cp 表示源代码区分大小写。这种   /字符串   的形式就是ml.exe的选项,这种选项还有很多中,如:/Fo 文件名   这个选项指定输出.obj的文件名,/Fe 文件名 这个选项指定输出的.exe文件名。我们将命令输入:

但是出现问题了:ml 不是内部文件或外部文件..... ,这是因为我们的ml.exe与我们的源文件不在同一个目录下,我们可以通过精确路径的方式来进行编译,但是每次都这样太麻烦了,所以这里我们要用到一个批处理文件:var.bat

就是这样的文件,上面的那个 set Masm32Dir=D:\Masm32就类似于一个C里面的宏定义,下面的%...%类似于转义字符,它会把百分号中间的Masm32Dir全都转成D:\Masm32。这个批处理文件的作用就是增加一个环境变量,当我们在我们的源文件的目录下时我们使用ml.exe,计算机会先在目录下寻找这个程序,没找到,再到环境变量中去找,这样我们就可以更方便地使用ml.exe和link.exe了。

我们先查看一下没运行那个批处理文件之前的环境变量,在DOS环境下使用  set 指令查看环境变量:

然后我们再运行一下批处理文件,然后再查看一下环境变量:

运行var.bat后并没有什么反应,但我们查看环境变量时可以看到:

 路径明显有变化,那就是我们增加的环境变量。然后我们再来进行编译和连接:

可以看到没问题了,出现 Assembling: 文件名  ,就说明编译成功了。注意:ml 后面的每一个选项都要用空格隔开,要不然会出错。

 我们可以看到目录下生成了一个 .obj 文件。

然后就要开始链接了,和 ml 一样,link.exe也有很多个选项,它的格式一般都是这样的:

link /subsystem:windows  xx.obj   yy.obj   zz.lib   cc.res

其中 subsystem:windows 表示指定程序运行的操作系统。然后后面就是我们所要连接的文件,如果不需要,也可以不加上那些.lib .res  。 link还有一些选项:/out:文件名  表示指定输出的文件名。我们来连接一下:

链接成功,看看文件夹:

和预期结果一致。运行程序试试:

运行成功!

make工具,nmake的用法,makefile

上面介绍了如何使用ml.exe以及 link.exe来进行编译和连接生成最终的可执行文件,但如果程序的数量一旦多起来,这样就显得很麻烦。所以我们有了make工具。

make类似于一个智能批处理工具,它会通过调用makefile文件中的命令来进行编译和连接,makefile文件里面指定了输出文件,目标文件和所需的资源文件,还指定了编译选项和连接选项。大概就是这个样子:

 因为我现在还用不到资源文件,所以我把那一行注释掉了。我们这里所要用的make工具叫nmake.exe,它同样也有很多选项。

如果不想使用默认的描述文件名(就是makefile文件)可以用选项: /f  描述文件名   来指定。

如果想把屏幕输出的信息存到一个文件中,可以用选项  /x  输出信息文件名  来指定。

输入 make /? 可以显示帮助信息:

 这些都是nmake的选项。

当然如果我们都使用makefile中的默认选项的话,直接输入nmake就可以了。关于makefile文件的内容暂时先不介绍。

使用nmake :同样我们也要先运行var.bat批处理文件,因为nmake与源文件也不在同一个目录下。然后我们直接键入nmake:

可以看到它直接执行完了编译和连接的过程,我们再看看目录下:

 可以看到目录中直接多出了一个.obj文件和一个.exe文件。OK

关于资源文件,书上推荐使用vs c++ 6.0软件里面的一个功能,可以将资源脚本文件编译成资源文件,但是目前还没下载这个 vs c++ 6.0 ,所以等下载了之后再尝试一下把资源文件一起链接进去。关于makefile文件打算在另一篇博客里面详细写一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值