实验四 汇编语言程序上机过程
一、实验学时
课堂2学时,课后2学时
二、实验目的
1、掌握Dos环境下常用工具软件 EDIT,MASM和LINK的使用。
2、伪指令: SEGMENT,ENDS,ASSUME,END,OFFSET,DUP。
3、实现汇编语言Helloworld。
4、了解INT 21H 中断功能。
三、实验要求
1) 做好实验预习,复习汇编语言各种伪指令的功能。
2) 按照实验内容与步骤的要求,独立思考,认真仔细地完成实验。
3) 执行实验步骤,截取必要截图,为源码写好注释,写出实验报告。
四、实验内容
程序:
DSEG SEGMENT
MESS DB \'Hello,World!\' ,0DH,0AH,24H
DSEG ENDS
SSEG SEGMENT PARA STACK
DW 256 DUP(?)
SSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
BEGIN: MOV AX,DSEG
MOV DS,AX
MOV DX,OFFSET MESS
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END BEGIN
五、实验步骤
1、用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为Hello.ASM。将源文件放到Dosbox挂载的目录下面。
EDIT.COM是一个早期的文本编辑器,最初是在MS-DOS操作系统中使用的。它是一个基于命令行的编辑器,可以用于创建、编辑和保存文本文件。它提供了一些基本的编辑功能,插入、删除、复制、粘贴和查找/替换。
输入EDIT.COM来打开EDIT,如图5-1-1所示。
接着输入内容,并保存为Hello.ASM,如图5-1-2所示。
ASM文件是一种文本文件,其中包含汇编语言代码。汇编语言是一种低级语言,它使用助记符来代替机器语言指令,使程序员能够更容易地编写和理解机器语言代码。
2、用MASM对源文件进行汇编,产生Hello.OBJ文件和Hello.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
MASM是一种汇编语言编译器,可以将汇编语言代码转换为可执行文件。
OBJ文件是目标文件的一种形式,它包含了汇编代码转换后的机器代码和符号表等信息。OBJ文件是链接器的输入文件之一,链接器将多个OBJ文件和库文件链接在一起生成可执行文件。
LST文件是汇编器生成的汇编代码清单文件,它列出了汇编代码的每一行,以及每一行对应的机器代码和符号表信息。LST文件可以帮助程序员检查编代码是否正确,以及查看汇编器如何将汇编代码转换为机器代码。
输入MASM Hello.ASM对源文件进行汇编,如图5-1-3所示。
接着输入dir来查看生成的Hello.LST和Hello.OBJ文件,如图5-1-4所示。
3、用edit或Type命令显示产生的Hello.LST文件。如图5-1-5所示。
4、用LINK将.OBJ文件连接成可执行的Hello.EXE文件。
DOS中的LINK命令是一个可执行文件链接器,它可以将多个目标文件链接成一个可执行文件。该命令通常用于编译和链接C或汇语言程序。
输入LINK Hello.OBJ将文件连接成可执行的Hello.EXE文件,如图5-1-6所示。
输入dir进行查看,如图5-1-7所示。
输入Hello.exe来运行可执行文件,如图5-1-8所示。屏幕显示Hello,World!
5、输入Debug Hello.exe对程序进行调试。
如图5-1-9所示。
输入U来执行反汇编命令,如图5-1-10所示。
输入T来单步执行命令,首先执行MOV AX,1CA7H如图5-1-11所示。
接着执行MOV DS,AX,如图5-1-12所示。
接着执行MOV DX,0000H,如图5-1-13所示。
接着执行MOV AH,09H,可以看到Display String的字样,Display String是一种命令,用于在屏幕上显示文本字符串。该命令通常用于批处理文件中,以便在执行批处理文件时向显示一些信息。如图5-1-14所示。
接着执行INT 21H,如图5-1-15所示,显示Instruction Breakpoint,在DOS中,当程序执行到一个断点指令时,会出现"Instruction
Breakpoint"错误提示。这意味着程序已经到达了一个设置的断点,并且已经停止执行。此时,程序员可以使用调器来检查程序的状态和变量值,以便找出程序中的错误。
最后MOV AH,4CH执行完以后显示End Program,如图5-1-16所示。
6、代码总结
对代码进行逐行分析:
DSEG SEGMENT
MESS DB \'Hello,World!\' ,0DH,0AH,24H
DSEG ENDS
DSEG SEGMENT和DSEG
ENDS之间的代码定义了一个数据段,名为DSEG。在这个数据段中,定义了一个名为MESS的字节数组,用于存储要显示的字符串"Hello,World!"以及回车换行符和结束符。
SSEG SEGMENT PARA STACK
DW 256 DUP(?)
SSEG ENDS
SSEG SEGMENT和SSEG
ENDS之间的代码定义了一个堆栈段,名为SSEG。在这个堆栈段中,定义了一个256字节的堆栈空间。
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
CSEG SEGMENT和CSEG
ENDS之间的代码定义了一个代码段,名为CSEG。在个代码段中,定义了一个程序入口点BEGIN。
ASSUME
CS:CSEG,DS:DSEG指令告诉汇编器,程序使用的代码段是CSEG,数据段是DSEG。
BEGIN: MOV AX,DSEG
MOV DS,AX
MOV DX,OFFSET MESS
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END BEGIN
MOV AX,DSEG指令将DSEG的段地址加载到AX寄存器中。
MOV DS,AX指令将AX寄存器的段地址加载到DS寄存器中,将DS寄存器设置为DSEG的段地址,以便程序可以访问DSEG中的数据。
MOV DX,OFFSET MESS指令将MESS的偏移地址加载到DX寄存器中,以便程序可以访问MESS中的字符串。
MOV AH,9指令将9加载到AH寄存器中,表示要执行DOS的"显示字符串"功能。
INT 21H指令调用DOS的21H中断,执行"显示字符串"功能,将MESS中的字符串显示在屏幕上。
MOV AH,4CH指令将4CH加载到AH寄存器中,表示要执行DOS的"程序结束"功能。
INT 21H指令调用DOS的21H中断,执行"程序结束"功能,退出程序。
六、实验小结
6.1 问题和解决办法
1.问题1:在使用DEBUG单步调试EXE程序的时候,显示Program terminated RC=16。
解决方法:"Program terminated RC=16"是指程序已经结束或终止,并且返回了一个16的返回码。返回码16通常表示程序遇到了一个严重的错误或异常情况,导致程序无法正常执行。
2.问题2:在输入MASM Hello.OBJ之后,并没有生成对应的LST和CRF文件。
解决方法:没有输入LST和CRF文件的名字和后缀,不会生成。
3.问题3:输入LINK Hello.OBJ之后,显示LINK:fatal error L1092:cannot open module- definition file - hello.def。
解决方法:模块定义文件不存在或路径不正确。在生成EXE文件的时候,不需要给def后缀的文件输入文件名。
6.2 心得体会
在本次实验中,我学习了如何在Dos环境下使用常用工具软件EDIT、MASM和LINK,并掌握了汇编语言中的伪指令,如SEGMENT、ENDSASSUME、END、OFFSET和DUP等。通过实现汇编语言Helloworld程序,我了解了INT 21H中断功能的使用方法。
通过本次实验,我深刻认识到了汇编语言的重要性和实用性,它可以帮助我们更好地理解计算机底层的工作原理,并且可以用于编写一些高效的程序。同时,我也意识到了在编写汇编语言程序时需要非常仔细和耐心,因为一个小小的错误可能会导致程序无法正常运行。
总之,本次实验让我不仅学到了许多汇编语言的知识和技能,还提高了我的实验能力和编程思维能力。我相信这些经验和技能在今后的计算机组成原理这门课的学习和以后编程方面的工作中都会对我有所帮助。