本文写给学汇编语言程序设计刚起步的吧友。适用Windows操作系统。已入门的吧友请绕道。
(1)masm32开发包的下载
要用汇编语言编程,首先得有个开发工具,汇编语言开发工具有多种,但本文仅介绍masm,介绍如何编写符合masm语法规范的源代码程序以及如何将源代码程序进行编译和链接,生成可执行的应用程序文件。 masm开发包包括汇编器、连接器等工具,版本有多种,本文选择使用masm32,其下载地址如下:http://www.masm32au.com/masm32/masm32v11r.zip 注释:masm32v11中的v11是masm32的版本号,而教科书上通常所说的masm版本指的是汇编器的版本号,这两者之间是有区别的。masm32v11中的汇编器文件名是 ml.exe,其版本号是v6.14.8444。(2)masm32开发包的安装指南
masm32v11r.zip文件下载以后,使用解缩工具将文件解压,释放出里面的唯一文件install.exe。通过Windows资源管理器或控制台窗口执行install.exe以后,既可安装开发包。install.exe执行后,中间会停下来问你是否重新配置开发包的安装目录。开发包安装的默认目录是c:\masm32,你可以重新配置安装目录,比如重新配置安装目录是d:\masm32 (以后我们就假定安装目录就是它)。安装目录配置好后按确认按钮,安装程序执行安装。以后安装过程只需要时间,其他没有对话。(3)masm32包中有关常用文件简介
masm32包即可以支持开发在DOS操作系统下运行的16位应用程序,也可以开发在Windows操作系统下运行的32位应用程序。在d:\masm32目录下有bin、include等多个子目录,里面存放着开发不同程序所用的工具文件和公用库文件。由于本文是介绍DOS操作系统下16位汇编语言程序设计,所以一开始我们只介绍与此相关的几个最常用的工具文件给您。 将当前目录切换到d:\masm32\bin,我们会看到该目录下有下面几个文件: ml.exe——汇编器。我们编写的源代码文件就是通过它来汇编生成中间代码文件,即通常扩展名为.obj的文件。 link16.exe——连接器。由ml.exe汇编生成的.obj文件还不能直接上机运行,必须通过连接器link16.exe将其连接制作成扩展名为.exe(或者.com)的可执行文件才能上机。(4)配置环境变量
首先说说为什么要配置环境变量。不严格地说,环境变量是操作系统干活时用来参考的资源。还是结合我们刚刚安装的开发包来说吧。请打开控制台窗口(可通过Windows附件里的“命令提示符”那个菜单打开),并输入下面的指令: d:回车 (注:将当前盘切换到d:盘。回车是要求你按回车键执行指令,下同) cd \masm32\bin 回车 (注:将当前目录切换到d:\masm32\bin) ml 回车 (注:执行ml.exe程序) 此时你会看到ml执行后在控制台窗口回显的提示信息。这说明操作系统找到了 ml.exe并执行。那操作系统是怎么寻找ml.exe的呢,我告诉你,在默认情况下操作系统只在当前目录下寻找ml.exe,由于我们已将当前目录切换为d:\masm32\bin,而ml.exe就在此目录下,所以你输入ml(或者输入ml.exe全名)并回车后,操作系统就在当前目录下找ml.exe文件(注:当只输入ml时,操作系统不仅仅是找扩展名为 .exe的文件,还包括.com、.bat等其他扩展名的可执行文件,有机会再介绍),找到后就调入内存并执行,如果找不到,操作系统就会去找一个叫做path的环境变量中去查询,沿着path所列的目录(叫路径)来查找。如果在path所列的目录中找到了目标文件,操作系统就会将该目标文件调入内存并执行;如果path所列的目录都找了仍没找到,操作系统就认为查找失败,并在控制台窗口显示没找到目标文件的相关信息,结束本次命令的执行。 真是这样吗?让我们来检验一下。请您在控制台窗口输入以下命令并执行:
cd .. 回车 (注:将当前目录切换到d:\masm32)
ml 回车 (注:执行ml.exe)此时控制台窗口会显示没有找到ml.exe的相关信息。为什么会出现这种情况?因为当前目录下没有ml.exe文件及以ml命名的其他可执行文件(如名为ml.com的文件和名为ml.bat的可执行文件等)。 由上文介绍可知,我们写一个汇编源代码程序如果不放在ml.exe所在的目录,用ml.exe汇编它还会遇到找不到ml.exe的困难,怎么解决这个问题呢?当然有办法,那就是配置环境变量path,让环境变量包含ml.exe文件所在的目录就可以了。 好了,现在我介绍如何配置环境变量。有几种方法: 一是通过Windows桌面上[我的电脑]来配置。因为吧里帖图比较麻烦,我就不介绍了,想弄清楚原理的话可以上网查查。 二是通过在控制台窗口输入以下命令来配置: set path=d:\masm32\bin;%path% 回车(这个不用太过理会,进行下面的步骤)这种方法有个缺点,就是每打开一次控制台窗口,就要重新配置一回,因为操作系统不保存用这种方法配置的结果。 好了,现在控制台当前目录还应该是d:\masm32,你再输入下面的指令试试: ml.exe有了,ml.exe回显的信息出现在屏幕上,说明本次环境变量配置成功,不管当前目录是不是ml.exe所在的目录,操作系统都能根据path找到ml.exe了。(5)编写第一个汇编语言程序: hello.asm
在没有编写程序之前,我们先在d:盘上建立一个名叫myasm的目录,(不会使用DOS指令可以通过Windows的资源管理器创建),这个目录就作为我们存放汇编语言开发项目的根目录,在该目录下再创建一个名为999的目录,这个目录就是我们放第一个汇编语言源代码文件hello.asm的目录。 masm32不是一个功能完善的集成开发环境(即IDE),我用过的比较好点的集成开发环境是RadASM,但限于篇幅本文不介绍它。不管怎样,汇编语言源代码的编写总是需要借助文本编辑器的。文本编辑器有多种,其他我们暂都不用,有机会再说,现在我们就因陋就简,使用Windows的记事本。请打开记事本,输入下面的内容:stack segment stackbyte 64 dup(0)stack endsdata segmentmsg byte 'hello world!$'data endscode segmentassume cs:code,ss:stack,ds:datastart:mov ax,datamov ds,axmov dx,offset msgmov ah,9int 21hmov ax,4c00hint 21hcode endsend start编辑完成后,将其保存名为hello.asm的文件,放在d:\myasm\999目录下。这就是我们编写的第一个汇编语言源程序。
(6)将hello.asm制作成可执行文件
请回到控制台窗口,输入以下指令: cd d:\myasm\999 回车 (注:将当前目录切换到d:\myasm\999) dir 回车 (注:查看当前目录下都有什么子目录和文件)你应该从控制台窗口看到hello.asm文件在列表中。好,一切正常。 我们现在要汇编hello.asm然后连接。在控制台窗口输入以下指令: ml.exe /c hello.asm 回车 (注:此步为汇编) hello.asm中的内容如果无错误,您会在控制台窗口看到下面的信息:D:\myasm\999>ml /c hello.asm
Microsoft (R) Macro Assembler Version 6.14.8444Copyright (C) Microsoft Corp 1981-1997. All rights reserved. Assembling: hello.asmD:\myasm\999>这说明编译成功。通过dir指令,你可以看到当前目录下多了一个hello.obj文件,这就是刚汇编生成的中间文件。
汇编成功了,第二步我们连接生成可执行文件。在命令行窗口输入: link16 hell.obj,,,,, 回车 (注:5个逗号,用途以后有机会再说) 连接成功会在控制台窗口显示以下信息:D:\myasm\999>link16 hello.obj,,,,,Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994Copyright (C) Microsoft Corp 1984-1993. All rights reserved. D:\myasm\999> 通过在控制台窗口输入dir命令,可以看到当前目录下又多了一个名为 hello.exe的文件,它就是我们通过汇编、连接最终生成的可执行文件。在命令行窗口输入命令执行它: hello.exe 回车 (注:执行hello.exe文件) 再看控制台窗口,会出现以下信息:D:\myasm\999>hello.exehello world!D:\myasm\999>这说明我们第一个入门程序开发成功了。