第五章 16位汇编学习环境
16位汇编语言的学习环境是建立在8086计算机的基础上的,我将借助于DosBox虚拟机来实现16位汇编语言学习环境的搭建。
5.1节 16位汇编语言学习环境
本节内容:16位汇编学习环境的搭建。
■汇编语言程序设计编程调试过程:分为编辑、汇编、连接和调试四个步骤。
■16位汇编语言学习环境搭建:DosBox虚拟机、Notepad++文本编辑工具、MASM5.0汇编器、Link链接器、Lib库工具和debug调试器。
从这节开始,我们正式开始学习16位汇编语言程序设计。根据计算机发展的历程,我们按照16位汇编、32位汇编、Win32汇编和64位汇编的顺序学习。构建前后衔接,完整的知识体系,这也是系统学习任何一门技术的基本要求。
在学习的过程中,一定要动手实验,动脑思考,身边准备好纸和笔,切不可盲目自信或妄自菲薄。任何一门技术的学习和积累都需要一个长期的由量变到质变的过程。当我们认真完成所有的实验和练习,一定会收获满满,并为我们下一步的学习打下坚实的基础。好了,让我们开始吧。
5.1.1 汇编语言程序设计编程调试过程
第一步:编写源程序。
第二步:汇编源程序。
第三步:链接目标程序。
第四步:调试可执行程序。
图5-1 汇编语言程序设计编程调试过程
我们把汇编语言程序设计编写调试过程分为四个步骤。如图5-1所示:
■第一步编辑:在第一步编辑源程序之前,一定要先设计程序的结构,定义程序中需要使用的数据结构,并分析实现功能所需要的算法。请记住“程序=数据结构+算法”。
程序设计采用自顶向下的方法。先把程序分为几个大的功能模块,通常为:
●数据定义——选择合适的数据结构;
●功能实现——通过特定算法实现既定任务;
●结果输出——屏幕输出、打印输出或者以文件形式保存到磁盘。
然后我们再将大的模块细分。我们将在第十章8086汇编语言程序设计基础的章节中详细讲解三种基本的程序设计结构(顺序结构、分支结构和循环结构),此处不再赘述。编写完源程序之后,将源程序保存为.ASM后缀名的源文件,之后就可以使用汇编器进行编译了。
■第二步汇编:在16位汇编中,我们采用微软的MASM5.0汇编器进行编译。汇编器的作用是将程序员编写的由字符串构成的汇编语言源文件翻译成二进制机器语言。机器语言与汇编指令是一一对应的关系,翻译的过程即查表。编译完成后,会生成以.OBJ为后缀名的目标代码程序文件。
为什么编译后生成.OBJ中间文件,而不是直接生成二进制可执行文件.EXE程序呢?
这是因为当我们需要使用外部功能模块时(一般以函数调用的方式使用),需要将外部模块的.OBJ添加到我们的源程序中,这就需要第三步连接。
■第三步连接:使用链接器LINK.EXE将一个或多个.OBJ连接生成一个独立的.EXE二进制可执行程序。接下来就是最后一步调试。
■第四步调试:由于连接后生成的.EXE程序可能会存在问题,我们称之为BUG。需要借助调试工具Debug.exe单步跟踪调试,直到修正BUG,确保程序的正确性。
提示
编译源程序之前的程序设计、数据定义和算法分析非常重要。作为一个合格的程序员,一定要严格按照既定的流程和步骤进行软件开发。这些流程和步骤是前人经验教训的总结。很多初学者往往会忽视流程的作用,认为按照流程作业比较麻烦,浪费时间。而事实恰恰相反,计算机语言和人类语言的区别在于,计算机语言需要严谨的逻辑,每一处细节都不能出错。人类的大脑暂且达不到这样的要求,所以要求程序员先使用纸和笔进行算法演算,写伪代码,画流程图。如果省略了前面的准备工作,直接编写代码,注定是漏洞百出。反复的修改和测试会浪费大量的时间,甚至导致彻底失败。初学者一旦养成坏的习惯,当意识到问题的严重性之后,往往很难改掉。切记悔不当初!
5.1.2 16位汇编语言学习环境搭建
在一堆枯燥的概念之后,终于到了激动人心的时刻了。我们可以编写自己的第一个程序了。但是在这之前,还需要搭建好必要的环境。16位汇编的环境包请在编程达人的官方网站编程达人、爱达人下载,或者在滴水逆向联盟论坛下载滴水逆向联盟论坛|VMP还原|逆向培训|TMD还原|VT调试器|怎么破解软件|外挂破解 - www.dtdebug.com。
■DOS操作系统环境
因为我们现在普遍使用的是Windows 64位系统,而16位汇编程序需要在DOS系统环境下运行。所以我们需要安装DosBox虚拟机。安装的过程非常简单。点击运行DosBox0.74-win32-installer.exe。如图5-2所示,每次都选择Next下一步即可。接下来还需要安装源文件的文本编辑工具。
●DosBox安装完成后启动,开机界面如图5-3所示。
●DOS系统命令可以在命令行输入“help”命令查询。常用的命令有:CLS清屏、CD显示或更改当前路径。其他命令可以参考图5-4。
●接下来配置虚拟机内的编译环境路径。如图5-5所示,命令行输入“mount c d:\code\dos\masm”。表示将DosBox虚拟机的C盘根目录等同于真实机的当前编译环境路径。然后在命令行输入“c:”,将编译路径切换到虚拟机C盘根目录,就可以在此路径下进行编译链接和调试了。本机将16位汇编工具包放置在“d:\code\dos\masm”路径下作为当前编译环境,16位汇编源程序放置在“D:\code\dos\masm\asm”文件夹内。读者可以将其替换为自己机器内的编译路径。
图5-2 DosBox安装
图5-3 DOSBOX开机界面
图5-4 DOS系统命令
图5-5 DosBox编译环境路径设置
提示
配置好DosBox虚拟机系统环境之后,我们会发现,每次重启DosBox虚拟机,都需要重新设置编译环境。为了简化这个步骤,可以添加一个批处理命令。具体方法如下:
选中DosBox虚拟机桌面快捷方式,点击鼠标右键,点击“属性”,打开属性对话框后,点击“打开文件所在位置”菜单,在DosBox安装目录下找到批处理文件“DosBox 0.74 Options.bat”并打开。在批处理文件的结尾添加如下脚本命令:
mount c d:\code\dos\masm
c:
根据每个人的工具包放置路径不同,指定自己的工具包路径。如果不需要使用此批处理命令,可以在脚本命令第一个字母前添加“#”屏蔽,如“#mount c d:\code\dos\masm”。
■文本编辑工具:Notepad++
汇编语言源程序的文本编写工具软件,可以使用记事本或任一文本编辑工具。从方便快捷的角度出发,我们推荐使用Nodtepad++文本编辑工具。如果读者有习惯偏好,可以使用其他自己喜欢的文本编辑工具。
Notepad++。安装的过程同样非常简单,如图5-6所示,每次都选择下一步即可。
图5-6 Notepad++安装
■MASM.EXE 5.0汇编器
MASM [/options] [source(.asm)],[out(.obj)],[list(.lst)],[cref(.crf)] [;]
可选的命令动作选项由符号“/”引导。利用命令“MASM /HELP”可获得有关命令动作选项及其说明信息。
source(.asm)指定源程序,缺省扩展名为ASM。
out(.obj)指定输出的目标代码文件。缺省的文件名同源文件名,缺省的扩展名为OBJ。
list(.lst)指定输出的列表文件,缺省扩展名是LST。缺省情况下不生成列表文件。
cref(.crf)指定输出的交叉参考文件,缺省的扩展名是CRF。缺省情况是不生成交叉参考文件。
命令行最后的[;]表示其后的缺省项,按缺省处理。
举例说明:汇编程序HELLO.ASM,在当前路径下编译HELLO.ASM源程序。
C>MASM HELLO
■LINK.EXE 链接器
LINK [/options] [source(.obj)...],[out(.exe)],[mapfile(.map)],[library(.lib)...] [;]
可选的命令动作选项由符号“/”引导。利用命令“LINK /HELP”可获得有关命令动作选项及其说明信息。
source(.obj)指定目标代码文件,缺省扩展名为OBJ。可以有多个目标程序代码文件,文件标识间用加号间隔或者用空格间隔。
out(.exe)指定输出的可执行文件。缺省的文件名同第一个目标代码模块的文件名,缺省的扩展名为EXE。
mapfile(.map)指定输出定位图文件,缺省扩展名是MAP。缺省情况下不生成定位图文件。
library(.lib)指定连接时使用的库文件,缺省的扩展名是LIB。可以有多个库,库文件标识间加号间隔或者使用空格间隔。缺省情况下不使用库。
命令行最后的[;]表示其后的缺省项,按缺省设置处理。
C>LINK HELLO;
C>LINK TEST1+TEST2,TEST; TEST1和TEST2连接,生成的可执行程序存放在TEST.EXE中。
C>LINK ABC+DEF.LIB 把目标代码模块ABC.OBJ与库DEF.LIB内的函数(过程)连接,生成的可执行程序文件存放在ABC.EXE中。
C>LINK TEST1+TEST2+DEF.LIB ,ABC.EXE,GHI.MAP 把主目标模块TEST1.OBJ和TEST2.OBJ与库DEF.LIB内的函数(过程)连接,生成的可执行程序文件存放在ABC.EXE中,生成定位图文件GHI.MAP。
动手实验6:汇编器masm.exe和链接器link.exe的使用方法
我们以第九章 8086汇编基础中的第一个汇编程序hello.asm为例。
第一步:编译源程序hello.asm,生成.obj文件。
如图5-7所示,命令行输入:“masm c:\asm\hello”。
“masm”表示执行masm.exe汇编器,“c:\asm\hello”为参数,即hello.asm源文件的路径,默认缺省“.asm”后缀名。
回车后,“Object filename [hello.OBJ]:”,表示编译后生成的OBJ文件名。直接回车,表示默认生成“hello.obj”。
下一行 “Source listing [NUL.LIST]:”,表示编译后生成的list文件名。
再下一行“cross-reference [NUL.CRF]:”,表示编译后生成的CRF文件名。
List文件和CRF文件,我们在这里不再赘述,将在第三部分32位汇编中讲述。
图5-7 masm汇编器
第二步:将.obj文件链接生成.exe二进制可执行文件。
如图5-8所示,命令行输入“link hello”。
图5-8 link链接器
“link”表示执行link.exe链接器,“hello”为参数,即当前路径下的hello.obj文件径,默认缺省“.obj”后缀名。
回车后,“Run File [HELLO.EXE]:”,表示链接后生成的EXE文件名。直接回车,表示默认生成“HELLO.EXE”。
下一行 “List File [NUL.MAP]:”,表示链接后生成的MAP文件名。
再下一行“Libraries [.LIB]:”,表示链接时连接的LIB库。
MAP文件,我们在这里不再赘述,将在第三部分32位汇编中讲述。
LIB库和多个OBJ文件的链接,我们将在第二十七章子程序库中详细讲述。
注意
注意:除了微软的MASM汇编器之外,还有TASM、NASM等其他厂商的汇编器,不同厂商的汇编器及相应的链接器的语法会有差异,甚至完全不同,如GNU汇编。本书只涉及微软的汇编语言开发工具包。
本文摘自编程达人系列教材《X86汇编语言教程》。资料下载:www.bcdaren.com