第三章 附 录
附录一 汇编语言上机实验基础
1.1 汇编语言程序上机实验过程
汇编源程序建立和修改源文件汇编源文件YES语法出错?NO连接程序调试程序YES功能出错?运行程序
图1.1 汇编语言程序上机实验过程
汇编语言上机实验的主要过程如图1.1所示,包括如下几个步骤: 1、建立和修改源程序文件
在编写出汇编语言源程序后,应建立源文件(扩展名为.ASM)。可运用Windows自带的记事本建立汇编源程序文件。 2、汇编源文件
.ASM源文件必须先由汇编程序(如ASM、MASM、TASM等)把它汇编(翻译)为目标文件(扩展名为.OBJ),才能在计算机上运行。
26
3、链接(链接)
为了使目标程序文件能在特定的系统环境下执行,经汇编后产生的目标文件需经过链接生成可执行文件(扩展名为.EXE),才能在计算机上启动运行。链接过程通过调用链接程序来完成。 4、调试
程序必须经过试运行和调试后才能正式投入运行。若程序没有错误,前3步完成后即可运行程序。若程序有错误,则在汇编提示错误下修改程序,直到程序无误经过汇编、链接生成可执行文件。调用调试程序(如DEBUG、TDEBUG等)进行调试。 5、运行程序
在程序没有错误的情况下即可运行程序。
1.2 宏汇编程序MASM
1、建立汇编源程序文件
可运用Windows自带的记事本建立汇编源程序文件。点击开始——程序——附件——记事本,在记事本中用键盘输入按完整的程序编写格式书写的源程序,存盘时取一个合适的文件名并加上扩展名.ASM,即可创建一个源程序文件。
例1 打开记事本输入一个源程序,设存盘时命名为HELLO.ASM(或hello.asm,不区分大小写)。
注意:存盘时一定要加上扩展名.ASM,否则保存的文件只是一般的文本文档(.TXT)。 2、源文件的汇编
汇编就是调用汇编程序对源程序进行翻译,生成扩展名为.OBJ的目标文件。可使用宏汇编程序MASM.EXE或小汇编程序ASM.EXE等对.ASM源文件进行汇编,汇编程序对.ASM文件进行两遍扫描,汇编后产生二进制目标文件(.OBJ文件)。目前最常用的是宏汇编程序MASM,主要由汇编程序MASM.EXE、链接(也称链接)程序LINK. EXE等组成。
MASM.EXE主要有以下功能:
(1)检查源程序中的语法错误,给出出错信息; (2)产生目标文件(.OBJ文件)、列表文件(.LST文件)和交叉引用文件(.CRF文件); (3)展开宏指令。
在.OBJ目标文件中只是一个浮动地址的目标程序。.LST列表文件是源程序、目标代码及其在段内存放的偏移地址的一个对照表,当源程序出现语法错误时,MASM在错误行后面给出错误性质提示,该表可打印出来供检查用。.CRF交叉引用文件用来产生交叉引用表,可以对符号进行前后对照,它给出了用户定义的所有符号(包括段名、变量、标号等),包括每个符号定义时所在行号以及引用时所在行号的情况,该文件对于阅读调试较大型多模块程序是有帮助的,还可作为资料归档,对于小型简单程序则不必建立该文件。
例如,运用MASM 5.0对HELLO.ASM进行汇编,假设HELLO.ASM与MASM、LINK、DEBUG等程序在同一文件夹下。双击MASM.EXE图标打开汇编程序窗口,汇编过程及窗口显示如图1.2所示。
27
图1.2 MASM汇编过程
打开汇编程序后,先显示版本号,然后依次提出四次询问。
第一次提示询问要汇编的源文件名,输入文件名HELLO回车后,出现第二次提示,询问目标文件名,括号内的信息为系统规定的默认文件名,通常直接回车,表示采用默认文件名。接着出现第三次提示,询问是否要建立列表文件,若要建立,则键入文件名,否则直接回车,不产生此文件。最后出现第四次提示,询问是否要建立交叉引用文件,若要建立,则键入文件名,否则直接回车,不产生此文件。在回答了第四次询问后,汇编程序就对源程序进行汇编,若汇编过程中发现源程序中有语法错误,则显示出错信息,包括错误语句行号、错误代码、错误类型,最后列出警告错误和严重错误的总数,此时用户应调出源文件对程序进行修改后重新汇编。
图1.1所示汇编结果只产生目标文件HELLO.OBJ,可在程序所在文件夹下查看到该文件。 3、目标文件的链接
汇编程序产生的目标文件用的是浮动地址,它不能直接上机执行,必须经过链接后才能生成可执行文件(.EXE)。可运用链接程序LINK.EXE完成链接工作,它可以把多个模块链接在一起,这些模块可以是库文件或汇编程序产生的目标文件。
例如,运用LINK对HELLO.OBJ进行链接。双击LINK.EXE图标打开链接程序窗口,链接过程及窗口显示如图1.3所示。
28
图1.3 LINK链接过程
打开链接程序后,先显示版本号,然后依次提出四次询问。
第一次提示询问链接的目标文件名,输入文件名HELLO回车后,出现第二次提示,询问要产生的可执行文件的文件名,通常直接回车,表示采用默认文件名。接着出现第三次提示,询问是否要建立地址分配文件(.MAP文件),若要建立,则键入文件名,否则直接回车,不产生此文件。最后出现第四次提示,询问是否用到库文件(.LIB文件),如没有库文件,则直接回车,如使用库文件,则键入库文件名。在回答了第四次询问后,链接程序就开始对程序进行链接,若链接过程中发现错误,则显示出错信息和错误类型,此时用户应调出源文件对程序进行修改后重新汇编、链接,直到无错为止。
回答第一次提示询问时,如果要链接多个目标文件,应一次输入,各目标文件名之间用“+”隔开。
.MAP文件给出每个段在存储器中的分配情况,一般不需要此文件。
如链接时不需要.LIB文件,也不需要产生.MAP文件,则在回答第一次提示询问时,可直接键入“目标文件名;”。此时也不需要用户回答剩余的三次询问。
图1.2所示链接结果只产生可执行文件HELLO.EXE,可在程序所在文件夹下查看到该文件。.EXE文件可运用DEBUG或TDEBUG等调试程序进行调试和运行。
注意:如果源程序没有堆栈段,则LINK结果会给出没有堆栈段的警告错误,但不影响程序的执行。
1.3 调试程序DEBUG
调试程序DEBUG.EXE是DOS提供的可用于调试可执行程序的一个工具软件,也是可用于汇编语言程序设计的一种调试工具。它通过单步执行、设置断点等方式为汇编语言程序员提供了非常有效的程序调试手段。DEBUG可以直接用来检查和修改内存单元、装入、存储及启动运行程序、检查及修改寄存器,也就是说DEBUG可深入到计算机的内部,可使用户更紧密地与计算机中真正进行的工作相联系。不仅如此,对汇编语言初学者来说,DEBUG也是练习使用汇编指令的一种有效工具。初学者可以直接在DEBUG环境下执行汇编指令。然而,在DEBUG下运行汇编语言源程序也受到了一些限制,它不宜汇编较长的程序,不便于分块程序
29
设计,不便于形成以DOS外部命令形式构成的 .EXE文件,不能使用浮动地址,也不能使用ASM和MASM提供的绝大多数伪指令。
DEBUG在不同版本的操作系统中具有不同的文件(功能一样): 1)纯DOS操作系统:DOS目录的DEBUG.EXE文件; 2)Windows 9x操作系统:MS-DOS环境下,使用Windows文件夹下command子文件夹的DEBUG.EXE文件;
3)Windows 2000/XP操作系统:MS-DOS环境下,使用WINNT或WINDOWS文件夹下的system32子文件夹中的DEBUG.EXE文件。
在DOS系统中,DEBUG是以DOS外部命令文件形式提供给用户的,名为DEBUG.EXE。命令文件DEBUG.EXE一般存放在DOS子目录下,因此调用DEBUG时,只需在DOS提示符下键入:
DEBUG [<驱动器名>:][<路径>][<文件名>[.<扩展名>]][<参数1>][<参数2>]<回车> [ ]表示可缺省。例如:C:\\DOS>DEBUG
Windows环境下打开DEBUG.EXE的方法是:点击开始菜单——运行,在运行中输入CMD(或COMMAND),确定后打开CMD.EXE,然后在CMD的>提示符后输入DEBUG <回车>,即可打开DEBUG。用户也可直接把DEBUG.EXE复制后粘贴在建立好的文件夹中使用,双击图标可打开程序。
DEBUG调入后,提示符是符号“-”。出现提示符“-”就表示可以接受DEBUG命令,所有的命令必须跟在“-”后键入才有效。
运行DEBUG时,如果不带被调试程序,则所有段寄存器值都相等,都指向当前可用的主存段。除SP外的通用寄存器都设置为0,SP指向这个段的尾部,IP置为100H,状态标志都是清0状态。
运行DEBUG时,如果带入的被调试程序扩展名不是.EXE,则BX和CX包含被调试文件大小的字节数(长度大于64K时BX为高16位),其他与不带被调试程序的情况相同。
运行DEBUG时,如果带入的被调试程序扩展名是.EXE,则需重新定位。此时CS:IP、SS:SP根据被调试程序确定,分别指向代码段和堆栈段。DS,ES指向当前可用主存段,BX和CX包含被调试文件大小的字节数,其他通用寄存器为0,状态标志都是清0状态。 一、DEBUG的部分主要命令格式与功能
DEBUG命令是在DEBUG提示符“-”下,由键盘键入的。每条命令以单个字母的命令符开头,然后是命令的操作参数,操作参数与操作参数之间,用空格或逗号隔开,操作参数与命令符之间用空格隔开,命令的结束符是回车键 Enter。命令及参数的输入可以是大小写的结合(即不区分大小写)。Ctrl+Break键可中止命令的执行。Ctrl+Num Lock键可暂停屏幕卷动,按任一键继续。
注意:所用数均为十六进制数,且不必写H。 1.汇编命令A(Assemble)
格式:A [[<段寄存器名>/<段地址>:] <段内偏移量>] 上式等价于([ ]表示可缺省,/表示或关系): (1) A <段寄存器名>:<段内偏移量> (2) A <段地址>:<段内偏移量> (3) A <段内偏移量> (4) A
功能:键入该命令后显示段地址和段内偏移量并等待用户从键盘逐条键入汇编命令,逐条汇编成代码指令,顺序存放到段地址和段内偏移量所指定的内存区域,直到显示下一地址时用户直接键入回车键返回到提示符“-”。
30