汇编语言上机实验指导.docx
《汇编语言上机实验指导.docx》由会员分享,可在线阅读,更多相关《汇编语言上机实验指导.docx(14页珍藏版)》请在冰点文库上搜索。
![汇编语言上机实验指导.docx](https://file1.bingdoc.com/fileroot1/2023-5/27/44e46a3a-cee5-421f-9ebe-855e55038b14/44e46a3a-cee5-421f-9ebe-855e55038b141.gif)
汇编语言上机实验指导
实验一汇编语言上机基本步骤
一、实验目的:
熟悉汇编语言的上机过程,掌握各项工具软件的使用方法
二、实验环境:
1.硬件:
PC微机
2.软件:
DOS系统、EDIT.EXE、MASM.EXE、LINK.EXE、DEBUG.EXE
三、实验内容:
1.前期准备:
在开始进行汇编语言上机练习之前,建立并进入自己的工作子目录,准备好相关工具软件如MASM.EXE、LINK.EXE等,其后所有工作均在自己的子目录中进行,以避免因路径概念不清而导致的文件存取错误,以及对系统其它部分造成影响。
1)建立自己的工作子目录(例如MYTEST):
C:
\>MDMYTEST
2)进入自己的工作子目录:
C:
\>CDMYTEST
3)将所需工具软件从其它地方(如C:
\MASM)拷贝进自己的工作子目录:
C:
\MYTEST>COPYC:
\MASM\MASM.EXE
C:
\MYTEST>COPYC:
\MASM\LINK.EXE
2.编写源程序:
原则上可以用任何文字处理软件(如EDIT、写字板、甚至WORD)编写源程序,但必须注意,源程序应为ASCII码文件(或称纯文本文件),扩展名一般为.ASM。
因此,建议使用DOS环境下的EDIT软件。
1)在DOS系统操作提示符下键入EDIT并回车,即可进入EDIT文本编辑环境。
如果没有进入,检查当前路径下是否存在EDIT.EXE文件,以及文件是否完整等。
2)从键盘输入下列程序(不必输入注释部分):
CODESEGMENT;定义一个CODE段
ASSUMECS:
CODE;定义CODE段为代码段
START:
;可执行语句起始处
MOVAH,02H;以下三条语句将显示字母a
MOVDL,’a’
INT21H
MOVAH,4CH;以下二条语句将返回DOS
INT21H
CODEENDS;CODE段结束
ENDSTART;整个程序结束
该程序的功能是仅在CRT屏上显示一个字母a,完成功能的只有其中的三条语句,但其它部分则是一个完整的汇编语言源程序必不可少的部分。
3)存盘退出EDIT文本编辑环境。
在存盘时应将文件的扩展名确定为.ASM(如TEST.ASM),并注意存盘的路径,最好与EDIT、MASM、LINK等软件相同。
4)在DOS系统提示符下利用DIR命令检查TEST.ASM文件是否确实产生。
3.汇编:
利用MASM.EXE宏汇编程序,将已经存盘的ASCII码源程序翻译成二进制目标程序,其扩展名一般为.OBJ。
1)操作方法:
假定当前工作路径为C:
\MYTEST>,且所需文件均存在于当前路径,则针对源程序TEST.ASM的汇编有以下三种方法(其中斜体部分由键盘输入):
a)C:
\MYTEST>MASM.EXE↘
Microsoft(R)MacroAssemblerVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.
Sourcefilename[.ASM]:
TEST↘
Objectfilename[TEST.OBJ]:
↘
Sourcelisting[NUL.LST]:
↘
Cross-reference[NUL.CRF]:
↘
51524+435132Bytessymbolspacefree
0WarningErrors
0SevereErrors
b)C:
\MYTEST>MASMTEST.ASM↘
Microsoft(R)MacroAssemblerVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.
Objectfilename[TEST.OBJ]:
↘
Sourcelisting[NUL.LST]:
↘
Cross-reference[NUL.CRF]:
↘
51524+435132Bytessymbolspacefree
0WarningErrors
0SevereErrors
c)C:
\MYTEST>MASMTEST;↘
Microsoft(R)MacroAssemblerVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.
51524+435132Bytessymbolspacefree
0WarningErrors
0SevereErrors
2)在上述三种方法中,推荐使用第三种,但是必须满足以下要求:
a)所有文件均位于当前工作路径下。
b)源程序扩展名为.ASM,目标程序扩展名为.OBJ。
3)若源程序有语法错误,则汇编结束将给出提示信息,并依次列出错误出现的行号及性质。
这时,应重新进入EDIT文本编辑环境中,根据提示对源程序进行修改,然后重新存盘、汇编。
只有所有错误为0,才能得到正确的目标文件。
注意该步骤只能检查出语法错误,对设计思想上的错误,应通过调试才能检查出来。
4)汇编结束后,检查是否产生相应目标程序TEST.OBJ。
4.连接:
利用LINK.EXE连接程序,将二进制目标程序整理成DOS系统下的可执行程序,其扩展名必须为.EXE。
1)操作方法:
与汇编相似,可有多种形式,一般使用:
C:
\MYTEST>LINKTEST;↘
但需注意这时的TEST应是.TEST.OBJ文件。
2)在得到正确的.OBJ文件后,该步骤一般不会出现问题,但可能会出现下列提示:
LINK:
warningL4021:
nostacksegment
针对该提示,可不予理会。
3)连接结束后,检查是否产生相应的可执行程序TEST.EXE。
5.运行:
1)如果没有问题,生成的可执行程序TEST.EXE即可以象其它DOS外部命令一样,直接在DOS系统下运行,整个编程工作完成。
如在本实验中:
C:
\MYTEST>TEST↘
2)一般在编写较复杂的程序时,可能出现设计上的错误。
如果不能在源程序中检查出错误,则必须通过DEBUG调试,才能检查出错误所在,然后再回到前面的各个步骤中重复操作。
在本实验中,由于程序简单,可以不必调试。
四、练习
对实验程序进行由浅及深的修改,领会上机的各个步骤及注意事项。
实验二用DEBUG调试程序
一、实验目的
学习利用DEBUG调试程序的基本思想及方法
二、实验环境:
1.硬件:
PC微机
2.软件:
DOS系统、EDIT.EXE、MASM.EXE、LINK.EXE、DEBUG.EXE
三、实验内容
利用DEBUG调试程序,可以将一个可执行程序(如.EXE、.COM等)装入内存中,并接管对程序运行的控制权,通过采取如反汇编、断点运行、单步执行、寄存器内容修改等方法,对可执行程序进行跟踪、调试,以找出其中的设计错误,然后再对源程序进行相应修改,重新生成正确的可执行程序。
1.准备被调试程序:
假定所有有关文件均在当前路径C:
\MYTEST>下,按照实验一的步骤生成一个被调试的可执行程序(如TEST.EXE),参考程序如下:
DATASEGMENT
STRDB‘Hello,World!
$’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETSTR
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2.进入DEBUG环境:
(其中斜体部分由键盘输入。
)
C:
\MYTEST>DEBUGTEST.EXE↘
-
其中,短线‘-’作为DEBUG环境的操作提示符,在此提示符下,可以输入各种DEBUG命令,对可执行程序TEST.EXE进行跟踪调试。
3.主要调试命令:
1)反汇编命令U:
将存储器中的二进制数据翻译成较有意义的助记符形式,以帮助理解。
一般常用以下格式:
a)-U↘:
从当前IP处开始,对连续约32字节内容反汇编。
如对TEST.EXE,刚装入DEBUG时的IP=0000,则在输入U命令后有如下显示:
-U↘
12B7:
0000B8B612MOVAX,12B6
12B7:
00038ED8MOVDS,AX
12B7:
0005BA0000MOVDX,0000
12B7:
0008B409MOVAH,09
12B7:
000ACD21INT21
12B7:
000CB44CMOVAH,4C
12B7:
000ECD21INT21
12B7:
0010EB51JMP0063
12B7:
00128B867AFMOVAX,[BP+FF7A]
………………
12B7:
001F8B4604MOVAX,[BP+04]
-
在上例中,12B7:
0000表示CS:
IP的内容(其中CS的值是动态值);B8B612代表该处存放的二进制数据,亦即指令MOVAX,12B6的机器代码;当连续约32字节的数据反汇编完后,重新回到DEBUG提示符“-”下,如果再键入U命令,则将继续对后面的内存区反汇编。
特别应该注意的是,由于反汇编命令针对内存区的二进制数据,而被调试程序仅占内存区的某一部分,故反汇编出来的内容并非全是被调试程序的代码,如上例中的JMP0063以后的部分,显然不是TEST.EXE的内容。
另外还需注意,DEBUG默认使用十六进制。
b)–U0123↘:
从指定的IP=0123处开始,对连续约32字节内容反汇编。
c)–U01230143↘:
从指定的IP=0123处开始反汇编,直至指定的0143处结束。
2)显示寄存器命令R:
显示或修改寄存器的内容。
一般常用以下形式:
a)-R↘:
显示所有寄存器当前的内容及当前将执行的指令。
如对TEST.EXE,在程序运行之前,键入R命令:
-R↘
AX=0000BX=0000CX=0020DX=0000SP=0000BP=0000SI=0000DI=0000
DS=12A6ES=12A6SS=12B6CS=12B7IP=0000NVUPEIPLNZNAPONC
12B7:
0000B8B612MOVAX,12B6
-
在显示寄存器内容时,标志寄存器F(或程序状态字寄存器PSW)表示成各个分离的标志位,其意义如下表所示:
溢出
方向
中断
符号
零
辅助进位
奇偶
进位
0
NV
UP
DI
PL
NZ
NA
PO
NC
1
OV
DN
EI
NG
ZR
AC
PE
CY
b)-RAX↘:
显示指定的AX寄存器当前的内容,并等待键入新值;如果不作修改,可直接回车。
如:
-RAX↘
AX0000
:
1234↘
-
c)-RF↘:
显示标志寄存器F各个标志位的内容,并等待键入新的标志位;如果不作修改,可直接回车。
如:
-RF↘
NVUPEIPLNZNAPONC-ZR↘
-
3)运行命令G:
使程序在DEBUG控制下运行,一般有全程、断点运行两种方式。
a)-G↘:
控制程序由当前IP处运行,直至程序结束。
如果当前IP为初始值,其作用则相当于直接在DOS下运行程序,一般用于快速观察程序的运行情况。
b)-G0123↘:
控制程序由当前IP处运行,直至指定的断点IP=0123H处,程序暂停,显示各个寄存器的当前值及断点处指令,然后返回DEBUG提示符“-”下。
如对TEST.EXE,若想观察字符串显示的入口参数是否设置好,则可以断点运行至000A处:
-G000A↘
AX=09B6BX=0000CX=0020DX=0000SP=0000BP=0000SI=0000DI=0000
DS=12B6ES=12A6SS=12B6CS=12B7IP=000ANVUPEIPLNZNAPONC
12B7:
000ACD21INT21
-
断点一般选取在需要观察的地方,当程序停下来后,可以根据各方面的情况(如寄存器、缓冲区、标志等)来判断程序是否运行正确。
4)单步命令T:
控制程序运行一条指令后暂停,显示各个寄存器的当前值及断点处指令,然后返回DEBUG提示符“-”下。
如对TEST.EXE,若当前IP为初始值,则键入T命令后有如下显示:
-T↘
AX=12B6BX=0000CX=0020DX=0000SP=0000BP=0000SI=0000DI=0000
DS=12A6ES=12A6SS=12B6CS=12B7IP=0003NVUPEIPLNZNAPONC
12B7:
00038ED8MOVDS,AX
-
单步命令一般用于需对程序运行作仔细分析的地方,如判断分支转移、观察运算结果等。
若能综合运用断点及单步指令,则可大大提高DEBUG调试的速度及效率。
但应注意,当IP指针位于INT21H一类指令处时,执行T命令将会使程序进入该功能调用子程序中,因此,这种情况下最好不用T命令,而用断点运行命令跳过该类功能调用指令。
5)显示内存命令D:
以十六进制及ASCII两种方式显示内存区的二进制数据,通常用来观察数据段内的缓冲区内容。
一般常用以下二种形式:
a)-D↘:
从0000单元开始,连续显示128个内存单元的内容,如果继续键入D命令,则继续显示后128个单元内容。
如对TEST.EXE,若想观察字符串显示时的字符串内容是否正确,则可在程序断点运行至000A处,键入D命令:
-DDS:
0↘
12B6:
000048656C6C6F2C576F-726C642124000000Hello,World!
$...
12B6:
0010B8B6128ED8BA0000-B409CD21B44CCD21...........!
.L.!
12B6:
0020EB518B867AFF2BC6-40508A460898508B.Q..z.+*****..P.
…………
12B6:
007083C4028B5E048A07-2AE489867AFF3BC6....^...*...z.;.
-
在上例中,128个单元分成8行,每行16个单元,每个单元的内容分别以十六进制形式和ASCII码形式显示。
如果该单元的内容不是可显示字符,则在ASCII区内显示为“.”。
b)–D01230143↘:
从指定的0123单元开始显示,直至指定的0143单元结束。
6)汇编命令A:
用于在DEBUG环境下直接键入汇编语言语句、生成较简单的可执行代码而不必经过完整的汇编语言编程步骤,或者用来在调试过程中临时修改某条指令。
如:
-A↘
127D:
0100MOVAH,02↘
127D:
0102MOVAL,6A↘
127D:
0104INT21↘
127D:
0106↘
-A0102↘
127D:
0102MOVDL,6A↘
127D:
0104↘
-
当键入汇编命令A后,将从当前IP或指定地址处提示输入汇编语句,每输入一条语句,DEBUG将其汇编成机器码,并存入相应的存储单元中,然后地址自动增加,继续提示输入下一条语句;如果直接回车,则结束汇编命令。
特别应注意的是,DEBUG默认使用十六进制,故在输入时不能使用H。
7)装载命令L:
用来将被调试程序重新装载进内存中,一般用于程序运行结束后需继续调试程序时,或需从头开始调试程序时。
如对TEST.EXE:
-G↘
Hello,World!
Programterminatednormally
-L↘-
8)退出命令Q:
键入此命令,即退出DEBUG状态,返回DOS。
实验三基本程序设计
一、实验目的
学习顺序、分支、循环三种基本结构的程序设计方法
二、实验环境:
1.硬件:
PC微机
2.软件:
DOS系统、EDIT.EXE、MASM.EXE、LINK.EXE、DEBUG.EXE
三、实验内容
1.编写程序,要求对键盘输入的小写英文字母用相应大写英文字母显示,如键盘输入“a”,则显示“A”。
2.编写程序,若键盘输入小写字母,则用相应大写字母显示;反之,若键盘输入大写字母,则用相应小写字母显示。
3.编写程序,循环实现上述程序2的功能,直至键盘输入任一非英文字符,程序停止。
四、练习
1.统计某班学生的成绩等级并存放在相应变量中。
等级的划分原则为:
A:
90~100B:
80~89C:
70~79D:
60~69E:
0~59
2.编写程序,统计某个字变量中1的个数并存放在相应变量中。
实验四数码转换程序设计
一、实验目的
学习不同进制数及编码间相互转换的程序设计方法
二、实验环境:
1.硬件:
PC微机
2.软件:
DOS系统、EDIT.EXE、MASM.EXE、LINK.EXE、DEBUG.EXE
三、实验内容
1.编写程序,要求从键盘输入一个多位十进制数(如123),在程序中将其转换成8位二进制数,以实现由ASCII码到二进制数的转换。
2.编写程序,要求从键盘输入两个二位十进制数(如12和34),在程序中将二数相加,并显示其和,以实现由二进制数到ASCII码的转换。
3.编写程序,在某内存区存放10个任意字节数,然后将它们按照十六进制形式显示出来,以实现由十六进制数到ASCII码的转换。
四、练习
从键盘输入两个十进制数,按照BCD原则相加,并显示其结果。
实验五排序程序设计
一、实验目的
学习综合程序的设计、编制及调试方法。
二、实验环境:
1.硬件:
PC微机
2.软件:
DOS系统、EDIT.EXE、MASM.EXE、LINK.EXE、DEBUG.EXE
二、实验内容
1.在数据区中存放10个不同大小的个位数,要求将它们由大到小(或相反)进行排序,并存放在另一数据区中。
2.在数据区中存放10个不同大小的个位数,要求将它们由大到小(或相反)进行排序,并存放在同一数据区中。
3.从键盘输入10个不同大小的个位数,利用冒泡法进行排序,然后显示在屏幕上。
三、练习
从键盘输入某班学生的某课程成绩,利用冒泡法对它们进行排序,然后按照由高到低的顺序显示在屏幕上。
要求学生人数不定。