3.5 汇编语言程序上机过程
上机操作是快速掌握汇编语言程序设计的重要方法。由于汇编语言的固有特点,实践环节尤显重要。实模式的汇编语言实践环境基于DOS平台。
当汇编语言源程序编好后,若要使它完成其功能,需经过建立、汇编、连接等过程(图3-8),如果出现错误,还需要进行跟踪调试。
1.建立源程序文件
可以用任何一种熟悉的文本编辑器建立、编辑汇编语言源程序。例如DOS提供的EDIT.COM。EDIT是一个全屏幕文本编辑器,类似于TC的编辑环境。启动EDIT的常用命令格式是:
EDIT [文件名]
其中文件名是可选的,如果只启动EDIT编辑新文件,则存盘时文件名一定要加扩展名.ASM;对于编辑已存在的汇编语言源程序,则采用以下格式(假设EDIT程序放在E盘的MASM子目录中):
E:\MASM>EDIT 文件名.ASM
图3-8 汇编、连接以及执行的步骤
进入编辑环境后。屏幕的第一行是菜单栏。可以使用Alt键激活菜单,然后用光标键和回车键选择所需项,弹出下拉菜单选择功能,按Esc键退出菜单选择,用File的存盘功能保存文件。最后通过选择File的Exit项退出EDIT。
若EDIT是从W indow s环境的MS-DOS方式进入的,则在DOS提示符后输入EXIT返回W indow s。
2.汇编源程序文件
汇编语言源程序经过汇编生成目标程序,这个过程由汇编程序实现。汇编程序的主要功能是检查用户源程序中的错误且显示出错信息,对宏指令进行扩展,把源程序翻译成机器语言的目标代码,生成列表文件等。为了适应模块化程序要求,汇编后目标程序中的地址部分是可浮动的相对地址,而不是可执行的绝对地址。
在DOS平台上使用较普遍的汇编程序是MASM,它由Microsoft公司出品。下面是使用Microsoft公司MASM汇编语言进行操作。首先在DOS提示符后输入MASM命令:
MASM文件名
例如,E:\MASM>MASMPROG
可以看到有4个提示,第一个提示要求输入源文件名,因为[.asm]中已缺省为.asm,所以只需输入文件名部分。第二个提示要求回答目标文件名,通常直接按回车键予以确认即可,但也可以输入自己希望的名字部分,扩展名为.obj,不必输入。第三个提示输入列表文件名。第四个提示输入交叉引用文件名,可以看到这两行的文件名是nul,表示默认情况下不产生,若需要则应输入名字部分,而扩展名则按默认情况使用.lst和.crf即可。对4个提示回答后开始汇编,若汇编过程中有错误则会随时给出错误行号和错误信息提示,显示的最后部分是警告错误数及严重错误数。若有错误,应再用文本编辑器进行编辑,然后再汇编,直至汇编通过。
对于以上回答,p rog.asm经汇编后在当前目录下产生了p rog.obj文件和p rog.lst文件。如果采用下列格式:
E:\MASM>MASMPROG;则可以不需要输入扩展名、列表名等步骤,直接生成p rog.obj文件。
3.连接目标文件
使用MASM汇编通过后,需要经过连接才能执行。连接程序的主要功能是连接分别产生的目标模块,解决外部交叉调用,产生一个可重定位的装入模块,以及产生可选的内存映像文件等。在DOS平台上使用较普遍的连接程序是LINK。
E:\MASM>LINK
LINK也有4个提示,需要对这些提示予以回答,不必输入扩展名,因为连接程序会按默认情况使用。第一个提示要求输入目标文件名,应该用以上汇编程序产生的.obj文件名回答。第二个提示是将要产生的可执行文件名,通常直接按回车键表示确认系统给出的默认文件名,这里是p rog.exe。第三个是内存映像文件的提示,默认情况不产生,若需要则应输入文件名,如本例所示。第四个是库文件的提示,通常直接按回车键,表示不使用库文件。
注意:当程序中没有定义堆栈段或虽然定义但不符合要求时,LINK在最后一行会给出警告信息“LINK:w arning L4021:no stack seg ment”,表示用户程序没有定义堆栈段。该警告信息不影响可执行程序的生成和正常运行,因为运行时自动使用系统提供的默认堆栈。
对于以上回答,p rog.obj经连接后在当前目录下产生了p rog.exe和p rog.map文件。
例如以下命令行对p rog.obj文件连接后在当前目录下产生p rog.exe文件。
E:\MASM>LINK PROG;
4.运行程序
当生成.exe或.com文件后,就可以输入该文件名运行(不必输入扩展名)。例如:
E:\MASM>PROG
如果程序使用各种测试数据均可运行并可看到正确结果,则该程序就可以投入正式使用。但若得不到正确结果或结果无法看到(即程序没有安排输出显示结果指令),此时要用到调试程序。
5.调试目标程序
若程序能够运行但不能得到预期结果,则需要静态或动态查错。静态查错即检查源程序,并在源程序级用文本编辑器进行修改,然后再汇编、连接、运行。但有时静态检查不容易发现问题,尤其是大或复杂的程序更是如此,这时就需要使用调试工具动态查错。当程序结果不能在屏幕上显示时也需要用调试工具查看结果。可以使用DEBUG程序进行调试,DEBUG是可执行文件或二进制文件的一种使用广泛的强有力的调试工具,它也可以直接对内存进行操作。详细操作请参考附录4。
【例3-40】 上机操作举例:编写计算表达式36×68+10的程序。
在第一章曾经编写此程序的代码段如下:
…
MOV AL,36
MOV BL,68
MULBL
ADD AX,10
…
现在将此问题重新编写成完整程序,并按上述步骤,显示这个程序的全部上机过程。
DATA SEGMENT
BUF DB 36,68,10
SUMDW?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX ;送DATA到AX寄存器
LEA BX,BUF
MOV AL,[BX];将BX指的第一个单元内容送AL
MOV BL,[BX+1];将BX指的第二个单元内容送BL
MULBL
ADD AX,[BX+2]
MOV SUM,AX;将结果送SUM单元
MOV AH,4CH;返回DOS
INT 21H
CODE ENDS
END START
上机过程如下(输入大小写都可以):
(1)运行EDIT程序编辑源程序。
E:\MASM>EDIT
注意存盘时,一定要加文件扩展名.ASM(如:PROG.ASM)
(2)调用MASM汇编源程序。
E:\MASM>MASMPROG;
此格式只生成同名的PROG.OBJ文件。
(3)调用LINK程序连接.OBJ文件。
E:\MASM>LINK PROG;
此格式可以生成同名的PROG.EXE文件。
(4)在DOS操作系统下运行PROG文件。
E:\MASM>PROG
如果上述步骤都正确,那么运行结果在屏幕上是看不出来的,原因是此程序没有输入输出语句,我们必须调用DEBUG程序检查此程序的正确性。
首先启动DEBUG。
E:\MASM>DEBUG PROG.EXE-
连接符“-”是DEBUG的提示符,可以在其后输入DEBUG命令。
①用U命令反汇编可执行代码。
-U
0BB4:0000B8B30B MOV AX,0BB3
0BB4:0003 8ED8MOV DS,AX
0BB4:0005 8D1E0000LEA BX,[0000]
0BB4:0009 8A07MOV AL,[BX]
0BB4:000B8A5F01MOV BL,[BX+01]
0BB4:000EF6E3MULBL
0BB4:0010 034702ADD AX,[BX+02]
0BB4:0013A30300MOV[0003],AX
0BB4:0016B44CMOV AH,4C
0BB4:0018CD21INT 21
其中最左边给出了本条指令首址的段基址——偏移量,接着是机器语言指令,最后是反汇编出来的汇编语言指令。段基址可能因操作系统管理的差异,不一定是0BB4。请注意它们与源程序表示方式的不同点。例如其中的数据一律用不带H后缀的十六进制形式表示,地址用其值而不是用符号表示。
②用G命令执行正在被调试的程序到断点处。为了让程序执行到刚刚使DS指向本程序的数据段位置,可以用G命令设置断点到0018处。
-G 0018
AX=4C90BX=0044CX=002ADS=0000SP=0000BP=0000SI=0000DI=0000
DS=0BB3ES=0BA3SS=0BB3CS=0BB4IP=0018NV UP EI PLNZ NA PE NC
0BB4:0018 CD21 INT 21
③用D命令查看数据段中的数据。
-D 0BB3:0000
0BB3:0000 24 44 0A90 09 00 00 00-0000000000000000
以上显示的是用户数据段的内容。其中左边部分为地址;中间为用十六进制表示的地址中的内容,每两位数占用一个内存单元。从数据段可以看出24H乘以44H加上0AH等于0990H。说明上述程序结果正确。
④用Q命令退出DEBUG返回到操作系统。
-Q
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。