汇编语言程序设计的实验环境及上机步骤.docx
- 文档编号:4182449
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:37
- 大小:161.56KB
汇编语言程序设计的实验环境及上机步骤.docx
《汇编语言程序设计的实验环境及上机步骤.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计的实验环境及上机步骤.docx(37页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计的实验环境及上机步骤
汇编语言程序设计的实验环境及上机步骤
一、实验环境
汇编语言程序设计的实验环境如下:
1.硬件环境
微型计算机(Intelx86系列CPU)一台
2.软件环境
⏹Windows98/2000/XP操作系统
⏹任意一种文本编辑器(EDIT、NOTEPAD(记事本)、UltraEDIT等)
⏹汇编程序(MASM.EXE或TASM.EXE)
⏹连接程序(LINK.EXE或TLINK.EXE)
⏹调试程序(DEBUG.EXE或TD.EXE)
文本编辑器建议使用EDIT或NOTEPAD,汇编程序建议使用MASM.EXE,连接程序建议使用LINK.EXE,调试程序建议使用TD.EXE。
二、上机实验步骤
注:
以下步骤适用于除汇编语言程序设计的实验一到实验四外的所有实验(实验一到实验四仅使用TD.EXE)。
1.确定源程序的存放目录
建议源程序存放的目录名为ASM(或MASM),并放在C盘或D盘的根目录下。
如果没有创建过此目录,请用如下方法创建:
通过Windows的资源管理器找到C盘的根目录,在C盘的根目录窗口中点击右键,在弹出的菜单中选择“新建”→“文件夹”,并把新建的文件夹命名为ASM。
请把MASM.EXE、LINK.EXE、DENUG.EXE和TD.EXE都拷贝到此目录中。
2.建立ASM源程序
建立ASM源程序可以使用EDIT或NOTEPAD(记事本)文本编辑器。
下面的例子说明了用EDIT文本编辑器来建立ASM源程序的步骤(假定要建立的源程序名为HELLO.ASM),用NOTEPAD(记事本)建立ASM源程序的步骤与此类似。
在Windows中点击桌面左下角的“开始”按钮→选择“运行”→在弹出的窗口中输入“EDIT.COMC:
\ASM\HELLO.ASM”,屏幕上出现EDIT的编辑窗口,如图1所示。
图1 文本编辑器EDIT的编辑窗口
窗口标题行显示了EDIT程序的完整路径名。
紧接着标题行下面的是菜单行,窗口最下面一行是提示行。
菜单可以用Alt键激活,然后用方向键选择菜单项,也可以直接用Alt-F打开File文件菜单,用Alt-E打开Edit编辑菜单,等等。
如果键入EDIT命令时已带上了源程序文件名(C:
\ASM\HELLO.ASM),在编辑窗口上部就会显示该文件名。
如果在键入EDIT命令时未给出源程序文件名,则编辑窗口上会显示“UNTITLED1”,表示文件还没有名字,在这种情况下保存源程序文件时,EDIT会提示输入要保存的源程序的文件名。
编辑窗口用于输入源程序。
EDIT是一个全屏幕编辑程序,故可以使用方向键把光标定位到编辑窗口中的任何一个位置上。
EDIT中的编辑键和功能键符合Windows的标准,这里不再赘述。
源程序输入完毕后,用Alt-F打开File菜单,用其中的Save功能将文件存盘。
如果在键入EDIT命令时未给出源程序文件名,则这时会弹出一个“Saveas”窗口,在这个窗口中输入你想要保存的源程序的路径和文件名(本例中为C:
\ASM\HELLO.ASM)。
注意,汇编语言源程序文件的扩展名最好起名为.ASM,这样能给后面的汇编和连接操作带来很大的方便。
3.用MASM.EXE汇编源程序产生OBJ目标文件
源文件HELLO.ASM建立后,要使用汇编程序对源程序文件汇编,汇编后产生二进制的目标文件(.OBJ文件)。
具体操作如下:
方法一:
在Windows中操作
用资源管理器打开源程序目录C:
\ASM,把HELLO.ASM拖到MASM.EXE程序图标上。
方法二:
在DOS命令提示符窗口中操作
选择“开始”→“程序”→“附件”→“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入MASM命令:
I:
>C:
<回车>
C:
>CD\ASM<回车>
C:
\ASM>MASMHELLO.ASM<回车>
操作时的屏幕显示如图2所示。
图2在DOS命令提示符窗口中进行汇编
不管用以上二个方法中的哪个方法,进入MASM程序后,都会提示让你输入目标文件名(Objectfilename),并在方括号中显示默认的目标文件名,建议输入目标文件的完整路径名,如:
C:
\ASM\HELLO.OBJ〈回车〉。
后面的两个提示为可选项,直接按回车。
注意,若打开MASM程序时未给出源程序名,则MASM程序会首先提示让你输入源程序文件名(Sourcefilename),此时输入源程序文件名HELLO.ASM并回车,然后进行的操作与上面完全相同。
图3有错误的汇编过程例子
如果没有错误,MASM就会在当前目录下建立一个HELLO.OBJ文件(名字与源文件名相同,只是扩展名不同)。
如果源文件有错误,MASM会指出错误的行号和错误的原因。
图3是在汇编过程中检查出两个错误的例子。
在这个例子中,可以看到源程序的错误类型有两类:
警告错误(WarningErrors)。
警告错误不影响程序的运行,但可能会得出错误的结果。
此例中无警告错误。
严重错误(SevereErrors)。
对于严重错误,MASM将无法生成OBJ文件。
此例中有两个严重错误。
在错误信息中,园括号里的数字为有错误的行号(在此例中,两个错误分别出现在第6行和第9行),后面给出了错误类型及具体错误原因。
如果出现了严重错误,你必须重新进入EDIT编辑器,根据错误的行号和错误原因来改正源程序中的错误,直到汇编没有错为止。
注意,汇编程序只能指出程序的语法错误,而无法指出程序逻辑的错误。
4.用LINK.EXE产生EXE可执行文件
在上一步骤中,汇编程序产生的是二进制目标文件(OBJ文件),并不是可执行文件,要想使我们编制的程序能够运行,还必须用连接程序(LINK.EXE)把OBJ文件转换为可执行的EXE文件。
具体操作如下:
方法一:
在Windows中操作
用资源管理器打开源程序目录C:
\ASM,把HELLO.OBJ拖到LINK.EXE程序图标上。
方法二:
在DOS命令提示符窗口中操作
选择“开始”→“程序”→“附件”→“命令提示符”,打开DOS命令提示符窗口,然后用CD命令转到源程序目录下,接着输入LINK命令:
I:
>C:
<回车>
C:
>CD\ASM<回车>
C:
\ASM>LINKHELLO.OBJ<回车>
操作时的屏幕显示如图4所示。
图4把OBJ文件连接成可执行文件
不管用以上二个方法中的哪个方法,进入LINK程序后,都会提示让你输入可执行文件名(Runfile),并在方括号中显示默认的可执行文件名,建议输入可执行文件的完整路径名,如:
C:
\ASM\HELLO.EXE〈回车〉。
后面的两个提示为可选项,直接按回车。
注意,若打开LINK程序时未给出OBJ文件名,则LINK程序会首先提示让你输入OBJ文件名(ObjectModules),此时输入OBJ文件名HELLO.OBJ并回车,然后进行的操作与上面完全相同。
如果没有错误,LINK就会建立一个HELLO.EXE文件。
如果OBJ文件有错误,LINK会指出错误的原因。
对于无堆栈警告(Warning:
NOSTACKsegment)信息,可以不予理睬,它不影响程序的执行。
如链接时有其它错误。
须检查修改源程序,重新汇编、连接,直到正确。
5.执行程序
建立了HELLO.EXE文件后,就可以直接在DOS下运行此程序,如下所示:
C:
>HELLO〈回车〉
C:
>
程序运行结束后,返回DOS。
如果运行结果正确,那么程序运行结束时结果会直接显示在屏幕上。
如果程序不显示结果,我们如何知道程序是否正确呢?
例如,这里的HELLO.EXE程序并未显示出结果,所以我们不知道程序执行的结果是否正确。
这时,我们就要使用TD.EXE调试工具来查看运行结果。
此外,大部分程序必须经过调试阶段才能纠正程序执行中的错误,调试程序时也要使用TD.EXE。
实验一数据传送
一、实验目的
1.熟悉8086指令系统的数据传送指令及8086的寻址方式。
2.利用TurboDebugger调试工具来调试汇编语言程序。
二、实验预习要求
1.复习8086指令系统中的数据传送类指令和8086的寻址方式。
2.预习TurboDebugger的使用方法(见附录二):
a)如何启动TurboDebugger;
b)如何在各窗口之间切换;
c)如何查看或修改寄存器、状态标志和存储单元的内容;
d)如何输入程序段;
e)如何单步运行程序段和用设置断点的方法运行程序段。
3.按照题目要求预先编写好实验中的程序段。
三、实验任务
1.通过下述程序段的输入和执行来熟悉TurboDebugger的使用,并通过显示器屏幕观察程序的执行情况。
练习程序段如下:
MOVBL,08H
MOVCL,BL
MOVAX,03FFH
MOVBX,AX
MOVDS:
[0020H],BX
2.用以下程序段将一组数据压入(PUSH)堆栈区,然后通过不同的出栈顺序出栈,观察出栈后数据的变化情况。
压栈程序段如下:
MOVAX,0102H
MOVBX,0304H
MOVCX,0506H
MOVDX,0708H
PUSHAX
PUSHBX
PUSHCX
PUSHDX
出栈程序段请自行编写(用不同的出栈顺序)。
3.指出下列指令的错误并加以改正,上机验证之。
(1)MOV[BX],[SI]
(2)MOVAH,BX
(3)MOVAX,[SI][DI]
(4)MOVBYTEPTR[BX],2000H
(5)MOVCS,AX
(6)MOVDS,2000H
4.设置各寄存器及存储单元的内容如下:
(BX)=0010H,(SI)=0001H
(10010H)=12H,(10011H)=34H,(10012H)=56H,(10013H)=78H
(10120H)=0ABH,(10121H)=0CDH,(10122H)=0EFH
说明下列各条指令执行完后AX寄存器中的内容,并上机验证。
(1)MOVAX,1200H
(2)MOVAX,BX
(3)MOVAX,[0120H]
(4)MOVAX,[BX]
(5)MOVAX,0110H[BX]
(6)MOVAX,[BX][SI]
(7)MOVAX,0110H[BX][SI]
5.将DS:
1000H字节存储单元中的内容送到DS:
2020H单元中存放。
试分别用8086的直接寻址、寄存器间接寻址、变址寻址、寄存器相对寻址传送指令编写程序段,并上机验证结果。
6.设AX寄存器中的内容为1111H,BX寄存器中的内容为2222H,DS:
0010H单元中的内容为3333H。
将AX寄存器中的内容与BX寄存器中的内容交换,然后再将BX寄存器中的内容与DS:
0010H单元中的内容进行交换。
试编写程序段,并上机验证结果。
7.设(DS)=1000H,(ES)=2000H,有关存储器的内容如图1.5所示。
要求将DS段的内容传送到AX寄存器,ES段的内容传送到BX寄存器,试编写程序段。
DS:
1000H
0FFH
0EEH
0DDH
0CCH
ES:
2000H
图1.5第7题图
实验二算术逻辑运算及移位操作
一、实验目的
1.熟悉算术逻辑运算指令和移位指令的功能。
2.了解标志寄存器各标志位的意义和指令执行对它的影响。
二、实验预习要求
1.复习8086指令系统中的算术逻辑类指令和移位指令。
2.按照题目要求在实验前编写好实验中的程序段。
三、实验任务
1.实验程序段及结果表格如表1.2:
表1.2
标志位
CF
ZF
SF
OF
PF
AF
程序段1:
MOVAX,1018H
MOVSI,230AH
ADDAX,SI
ADDAL,30H
MOVDX,3FFH
ADDAX,BX
MOV[20H],1000H
ADD[20H],AX
PUSHAX
POPBX
0
0
0
0
0
0
程序段2:
MOVAX,0A0AH
ADDAX,0FFFFH
MOVCX,0FF00H
ADCAX,CX
SUBAX,AX
INCAX
ORCX,0FFH
ANDCX,0F0FH
MOV[10H],CX
0
0
0
0
0
0
程序段3:
MOVBL,25H
MOVBYTEPTR[10H],4
MOVAL,[10H]
MULBL
0
0
0
0
0
0
程序段4:
MOVWORDPTR[10H],80H
MOVBL,4
MOVAX,[10H]
DIVBL
0
0
0
0
0
0
程序段5:
MOVAX,0
DECAX
ADDAX,3FFFH
ADDAX,AX
NOTAX
SUBAX,3
ORAX,0FBFDH
ANDAX,0AFCFH
SHLAX,1
RCLAX,1
0
0
0
0
0
0
2.用BX寄存器作为地址指针,从BX所指的内存单元(0010H)开始连续存入三个无符号数(10H、04H、30H),接着计算内存单元中的这三个数之和,和放在0013H单元中,再求出这三个数之积,积放0014单元中。
写出完成此功能的程序段并上机验证结果。
3.写出完成下述功能的程序段。
上机验证你写出的程序段,程序运行的最后结果(AX)=?
(1)传送15H到AL寄存器;
(2)再将AL的内容乘以2;
(3)接着传送15H到BL寄存器;
(4)最后把AL的内容乘以BL的内容。
4.写出完成下述功能的程序段。
上机验证你写出的程序段,程序运行后的商=?
(1)传送数据2058H到DS:
1000H单元中,数据12H到DS:
1002H单元中;
(2)把DS:
1000H单元中的数据传送到AX寄存器;
(3)把AX寄存器的内容算术右移二位;
(4)再把AX寄存器的内容除以DS:
1002H字节单元中的数;
(5)最后把商存入字节单元DS:
1003H中。
5.下面的程序段用来清除数据段中从偏移地址0010H开始的12个字存储单元的内容(即将零送到这些存储单元中去)。
(1)将第4条比较指令语句填写完整(划线处)。
MOVSI,0010H
NEXT:
MOVWORDPTR[SI],0
ADDSI,2
CMPSI,
JNENEXT
HLT
(2)假定要按高地址到低地址的顺序进行清除操作(高地址从0020H开始),则上述程序段应如何修改?
上机验证以上两个程序段并检查存储单元的内容是否按要求进行了改变。
6.输入并运行表1.3中的程序段,把结果填入表右边的空格中,并分析结果,说明本程序段的功能是什么。
表1.3
程序段
字单元(1A00H)=
字单元(1A02H)=
MOV[1A00H],0AA55H
MOV[1A02H],2AD5H
SHLWORDPTR[1A02H],1
CMP[1A00H],8000H
CMC
RCLWORDPTR[1A02H],1
RCLWORDPTR[1A00H],1
实验三串操作
一、实验目的
1.熟悉串操作指令的功能。
2.了解串操作指令的使用方法。
二、实验预习要求
1.复习8086指令系统中的串操作类指令。
2.按照题目要求在实验前编写好实验中的程序段。
三、实验任务
1.输入以下程序段并运行之,回答后面的问题。
CLD
MOVDI,1000H
MOVAX,55AAH
MOVCX,10H
REPSTOSW
上述程序段执行后:
(1)从DS:
1000H开始的16个字单元的内容是什么?
(2)(DI)=?
(CX)=?
,并解释其原因。
2.在上题的基础上,再输入以下程序段并运行之,回答后面的问题。
MOVSI,1000H
MOVDI,2000H
MOVCX,20H
REPMOVSB
程序段执行后:
(1)从DS:
2000H开始的16个字单元的内容是什么?
(2)(SI)=?
(DI)=?
(CX)=?
,并分析之。
3.在以上两题的基础上,再输入以下三个程序段并依次运行之。
程序段1:
MOVSI,1000H
MOVDI,2000H
MOVCX,10H
REPZCMPSW
程序段1执行后:
(1)ZF=?
根据ZF的状态,你认为两个串是否比较完了?
(2)(SI)=?
(DI)=?
(CX)=?
,并分析之。
程序段2:
MOV[2008H],4455H
MOVSI,1000H
MOVDI,2000H
MOVCX,10H
REPZCMPSW
程序段2执行后:
(1)ZF=?
根据ZF的状态,你认为两个串是否比较完了?
(2)(SI)=?
(DI)=?
(CX)=?
,并分析之。
程序段3:
MOVAX,4455H
MOVDI,2000H
MOVCX,10H
REPNZSCASW
程序段3执行后:
(1)ZF=?
根据ZF的状态,你认为在串中是否找到了数据4455H?
(2)(SI)=?
(DI)=?
(CX)=?
,并分析之。
4.从DS:
1000H开始存放有一个字符串”Thisisastring”,要求把这个字符串从后往前传送到DS:
2000H开始的内存区域中(即传送结束后,从DS:
2000H开始的内存单元的内容为”gnirtsasisihT”),试编写程序段并上机验证之。
实验四字符及字符串的输入和输出
一、实验目的
1.熟悉如何进行字符及字符串的输入输出。
2.掌握简单的DOS系统功能调用。
二、实验预习要求
1.复习系统功能调用的1、2、9、10号功能。
2.按照题目要求预先编写好实验中的程序段。
三、实验任务
1.输入以下程序段并用F8键单步运行,执行INT21H指令时,在键盘上按“5”键。
MOVAH,1
INT21H
(1)运行结束后,(AL)=?
它是哪一个键的ASCII码?
(2)重复运行以上程序段,并分别用“A”、“B”、“C”、“D”键代替“5”键,观察运行结果有何变化?
2.在DS:
1000H开始的内存区域设置如下键盘缓冲区:
DS:
1000H5,0,0,0,0,0,0
然后输入以下程序段并用F8键单步运行,执行INT21H指令时,在键盘上键入“5”、“4”、“3”、“2”、“1”、〈回车〉这六个键。
LEADX,[1000H]
MOVAH,0AH
INT21H
程序段运行完后,检查DS:
1000H开始的内存区域:
(1)DS:
1001H单元的内容是什么?
它表示了什么含义?
(2)从DS:
1002H开始的内存区域中的内容是什么?
其中是否有字符“1”的ASCII码?
为什么?
3.输入以下程序段并运行之。
MOVDL,‘A’
MOVAH,2
INT21H
(1)观察屏幕上的输出,是否显示了“A”字符?
(2)分别用“#”、“X”、“Y”、“$”、“?
”代替程序段中的“A”字符,观察屏幕上的输出有何变化。
(3)分别用0DH、0AH代替程序段中的“A”字符,观察屏幕上的输出有何变化。
(4)用07H代替程序段中的“A”字符,观察屏幕上有无输出?
计算机内的扬声器是否发出“哔”的声音?
4.要在屏幕上显示一个字符串“Hello,world”,写出该字符串变量的定义语句和显示这个字符串的程序段。
上机验证之。
5.按6行×16列的格式顺序显示ASCII码为20H到7FH之间的所有字符,即每16个字符为一行,共6行。
每行中相邻的两个字符之间用空格字符分隔开。
试编写程序段并上机运行验证。
提示:
程序段包括两层循环,内循环次数为16,每次内循环显示一个字符和一个空格字符;外循环次数为6,每个外循环显示一行字符并显示一个回车符(0DH)和一个换行符(0AH)。
实验五直线程序设计
一、实验目的
1、学习8086汇编语言程序的基本结构和程序设计的基本方法。
2、熟悉在PC机上建立、汇编、链接、调试和运行8086汇编语言程序的全过程。
二、实验预习要求
1、认真阅读预备知识中汇编语言的上机步骤的说明,熟悉汇编程序的建立、汇编、连接、执行、调试的全过程。
2、复习BCD码运算的调整指令。
3、根据本实验的编程提示和程序框架预先编写汇编语言源程序。
4、有兴趣的同学请自行编写出后面的实验习题。
三、直线程序简介
直线程序是控制流仅有一个走向的程序,它主要用于解决一些无需进行判断分支,也无需循环简单的简单问题。
四、实验内容
设a、b、c、d四个数分别以压缩的BCD码形式存放在内存NUM开始的四个单元,计算(a+b)-(c+d),然后把结果显示在屏幕上。
改变a,b,c,d内容,然后重新汇编、连接并运行程序,检查其结果与手工计算是否相符。
下面是几组实验用的数据:
1、a=09,b=16,c=04,d=17
2、a=38,b=41,c=29,d=34
3、a=70,b=23,c=42,d=41
4、a=63,b=73,c=62,d=50
五、调试提示
源程序编制完后,先静态检查,无误后,对源程序进行汇编连接,生成可执行文件。
先将程序在DOS下运行,如正确,则改变a,b,c,d的值反复验证,如不正确,则将程序调入TD中进行调试。
六、实验习题
若改变a,b,c,d的值如下:
1、a=90,b=34,c=33,d=44
2、a=12,b=19,c=25,d=33
观察结果,改进程序使结果正确。
实验六分支及循环程序设计
一、实验目的
1、学习提示信息的显示及键盘输入字符的方法。
2、掌握分支程序和循环程序的设计方法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 实验 环境 上机 步骤