《汇编语言》实验指导书.docx
《《汇编语言》实验指导书.docx》由会员分享,可在线阅读,更多相关《《汇编语言》实验指导书.docx(54页珍藏版)》请在冰点文库上搜索。
《汇编语言》实验指导书
《汇编语言》实验指导书
李凤云编
信息工程系计算机应用教研室
目录
实验一Debug命令的使用………………………………3
实验二基本汇编指令的使用……………………………7
实验三汇编语言程序的调试与运行……………………10
实验四系统功能调用程序的调试与运行………………15
实验五分支程序设计……………………………………17
实验六循环程序设计……………………………………20
实验七子程序设计………………………………………23
实验八高级汇编语言程序设计…………………………25
实验九I/O程序设计……………………………………30
实验十中断程序设计……………………………………33
实验十一综合程序设计…………………………………38
实验一Debug命令的使用
一、知识点
1、DEBUG简介
DEBUG.EXE是DOS提供的用于调试可执行程序的一个工具软件。
在汇编语言程序调试中很常用。
DEBUG的提示符是“-”,所有DEBUG调试命令军在此提示符下输入。
DEBUG命令都是一个字母,后跟一个或多个参数,也可使用默认参数。
DEBUG命令的使用注意问题:
(1)字母不分大小写
(2)只使用十六进制数,但没有带后缀字母“H”
(3)命令如果不符合DEBUG的规则,则将以“error”提示,并以“^”指示出错位置。
(4)每个命令只有按下回车键后才有效,可以用Ctrl+Break终止命令的执行。
2、Debug的调入和退出
以WIN2000环境为例,点击“开始/运行…”,在“运行”对话框中输入命令:
cmd,然后点击“确定”,进入DOS命令行状态:
C:
\DocumentsandSettings\lfy>
然后输入命令:
>Debug
进入Debug调试状态,出现Debug命令提示府“-”,在此提示符下可运行所需要的Debug命令了。
退出Debug的命令:
Q
3、Debug常用命令
(1)汇编命令A,格式为:
-A[地址]
功能:
从指定地址开始允许输入汇编指令,并将该指令汇编成机器指令代码从指定地址开始存放。
若不指定地址,则系统从默认的地址开始存放。
按回车键退出汇编状态
应用:
用于调试一条指令或几条指令组成的一个程序段。
(2)显示和修改寄存器命令R,格式为:
-R[寄存器名]
功能:
若指定寄存器,则显示指定的寄存器的内容,并可进行修改;若不要修改,则按Enter健。
若未指定寄存器,则默认为显示所有寄存器的内容。
应用:
常用于通过寄存器的值查看指令的执行结果。
(3)内存单元内容的命令E,格式为:
-E地址[内容表]
功能:
若指定内容表,则用内容表中的内容代替指定地址开始的存储单元的值;否则,从指定地址开始逐个单元显示其内容,并等待用户修改,按空格键则继续显示下一单元的值,按回车键结束。
例如:
-E100
184E:
010089,78
其中,184E时数据段的段地址,0100是要修改的单元的偏移地址,89为该单元的值,78为程序员键入的值。
结果0100单元的值由89H改变为78H。
应用:
常用于在调试程序的过程中改变变量的初始值。
(4)显示内存单元内容的命令D,格式为:
-D[地址]或–D[范围]
功能:
前者为显示从指定地址开始的一段存储单元的值;后者为显示指定范围内的存储单元的值。
例如:
-D200;显示从DS:
200单元开始的各单元的值
-D200L10;显示从DS:
200单元开始的10个字节单元的值。
应用:
常用于在调试过程中检查变量的值。
(5)单步执行命令T,格式为:
-T[=地址]
功能:
从指定地址执行一条指令后停下来,显示寄存器内容和状态值。
若未指定地址,则执行当前指令的下一条指令。
(6)反汇编命令U,格式为:
-U[地址]或-U范围
功能:
从制定地址开始,反汇编32个字节,或对指定范围内的主存内容进行反汇编。
若没有指定地址,则接着上一个U命令的最后一个单元开始;若还没有使用过U命令,则从当前CS:
IP开始。
例如:
-U100,106
1343:
0100B80302MOVAX,0203
1343:
0103BB0540MOVBX,4005
1343:
010601D8ADDAX,BX
其中,屏幕最左边是主存逻辑地址(段地址:
偏移地址),中间是该指令的机器代码,右边是对应指令的汇编语句格式。
(7)运行命令G,格式为:
-G[=起始地址][断点地址1,断点地址2,……,断点地址10]
功能:
从等号后的起始地址开始运行,直到遇到断点或程序正常结束。
例如:
-G=100106
则程序执行从100开始的程序段,到断点106停止。
此时指令ADDAX,BX并未执行。
二、实验目的及要求
1、编语言调试环境Debug的使用,重点掌握常用命令(ARDET)的使用,其他指令在以后的学习中逐步掌握。
2、利用Debug命令,调试采用不同寻址方式的指令的执行结果,从实践中加深对寻址方式和MOV指令的理解。
三、实验内容
1、Debug程序的调入和退出
2、Debug常用调试命令的使用
3、MOV指令、XCHG指令、XLAT指令的调试
四、实验步骤
说明:
首先输入以下程序段,然后单步执行并查看结果;改变寄存器AX的初始值后再运行,并查看结果。
带下划线的部分为程序员输入的内容。
在DEBUG环境下,所有的数据均以十六进制输入和显示。
-A
137B:
0100movax,20
137B:
0103movbx,ax
137B:
0105addax,bx
137B:
0107mov[2000],ax
137B:
010A
-T=0100
AX=0020BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=137BES=137BSS=137BCS=137BIP=0103NVUPEIPLNZNAPONC
137B:
010389C3MOVBX,AX
-T=0103
AX=0020BX=0020CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=137BES=137BSS=137BCS=137BIP=0105NVUPEIPLNZNAPONC
137B:
010501D8ADDAX,BX
-T
AX=0040BX=0020CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=137BES=137BSS=137BCS=137BIP=0107NVUPEIPLNZNAPONC
137B:
0107A30020MOV[2000],AX
DS:
2000=000
-T
AX=0040BX=0020CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=137BES=137BSS=137BCS=137BIP=010ANVUPEIPLNZNAPONC
137B:
010A0000ADD[BX+SI],ALDS:
0020=FF
-D2000L2
137B:
20004000
.
;修改0100处的指令movax,20将AX的初始值改为10,并重新运行
-A0100
137B:
0100movax,10
137B:
0103
;最后一条指令执行的结果如下:
AX=0020BX=0010CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=137BES=137BSS=137BCS=137BIP=010ANVUPEIPLNZNAPONC
137B:
010A0000ADD[BX+SI],ALDS:
0010=DF
;查看2000单元的值为0020H
-D2000l2
137B:
20002000
.
;修改2000单元的值,由20h改为30h并重新显示
-E2000
137B:
200020.30
-D2000l2
137B:
20003000
五、拓展题
MOV、XCHG、XLAT指令的调试。
要求:
用汇编命令A输入以下源程序段,用T命令单步执行,查看执行结果:
寄存器或存储单元的值。
。
提示:
在DEBUG环境下输入程序段时要省掉立即数后面的字符“H”
1、MOV指令的调试
程序段:
MOVAL,55H
MOVAH,AL
MOVBX,1000H
MOVBYTEPTR[BX],66H
MOVWORDPTR[BX+2],77H
MOV[BX+4],AX
2、XCHG指令的调试
程序段:
MOVAX,0203H
MOVBX,0405H
XCHGAX,BX
XCHGBL,BH
3、XLAT指令的调试
(1)用E命令从DS:
200地址开始输入数据10H、20H、30H、40H、50H
(2)用A命令输入以下程序段:
MOVBX,200;将数据的首地址送给BX
MOVAL,4用MOV;将要查找的数据的偏移地址送给AL
XLAT
;查看结果寄存器AL中的值,以及从DS:
200开始的存储单元的值。
六、实验报告
写出在DEBUG状态下编写、运行程序段的过程以及调试所中遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。
实验二基本汇编指令的使用
一、知识点
1、最常用的传送指令MOV
可以将立即数/内存单元的值/寄存器的值送给寄存器,或将立即数/寄存器的值送给内存单元,但不允许两个内存单元之间直接传送。
2、常用算术运算指令ADD/ADC/INC、SUB/SBB/DEC/CMP/NEG
两个单字节/单字之间的加法用ADD指令、减法用SUB指令;
多字节/多字之间的加/减,除最低字节/最低字用ADD/SUB指令外,其余字节/字之间的加/减都要用包含进位/借位的ADC/SBB指令。
INC和DEC指令常用于修改计数器或修改指针,常用与循环处理一批数据。
CMP指令常用于比较两个数的关系,为下一步的条件转移做准备(后跟条件转移指令)。
3、常用逻辑运算指令AND/OR/NOT/XOR/TEST
AND指令常用于给一个数据的某几位清零;
OR指令常用于给一个数据的某几位置1;
XOR指令常用于将一个数据某几位翻转;
NOT指令常用于将一个数据所有位取反;
TEST指令常用于测试一各数据的某一位或某几位的值,后跟条件转移指令。
4、常用移位指令SHL/SHR/SAR/ROL/ROR/RCL/RCR
SHL和SAL功能相同,都是将操作数左移一位或几位,移出的空位补0;
SHR和SAR功能不同,虽都是将操作数右移一位或几位,但左边移出的空位分别补0和1(SHR要补0,SAR补1)。
二、实验目的及要求
1、继续熟悉汇编语言调试环境Debug的使用,掌握常用调试命令。
2、用基本指令编写的程序段,并在Debug环境中调试,从实践中加深对基本汇编语言指令的执行过程的理解。
3、实验前要做好充分准备,包括汇编程序段清单、调试步骤、调试方法,以及对程序结果的分析等。
三、实验内容
1、单步调试以下程序段,给出每条指令执行后AL的值,以及CF、ZF、SF、OF的状态。
MOVAL,89H
ADDAL,AL
ADDAL,9DH
CMPAL,0BCH
SUBAL,AL
DECAL
INCAL
2、编写程序段,分别完成11223344H与55667788H的加/减计算,并调试、观察结果。
3、单步调试以下程序段,给出每条指令执行后AL的值,以及CF、ZF、SF、OF的状态。
MOVAX,1470H
MOVBX,3060H
ANDAX,BX
ORAX,BX
XORAX,AX
NOTAX
TESTAX,0F0F0H
4、设(AX)=1234H,写出执行下列每条指令后AX寄存器的内容,并观察CF的变化。
SHLAX,1
MOVCL,2
SHLAX,CL
SHRAX,1
ROLAX,1
MOVCL,3
ROLAX,CL
RCRAX,1
MOVCL,2
RCRAX,CL
四、实验步骤
1、利用DEBUG的A命令输入待调试的程序段。
2、利用单步执行命令T逐条执行指令,观察寄存器及相关状态位的值。
以实验内容2中的加法为例,实现加法运算:
注:
下划线部分为程序员输入的内容。
(1)-A
1373:
0100MOVAX,3344;DX.AX<-11223344H
1373:
0103MOVDX,1122
1373:
0106ADDAX,7788;DX.AX+55667788H->DX.AX
1373:
0109ADCDX,5566
1373:
010D
-T=100
AX=3344BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=1373ES=1373SS=1373CS=1373IP=0103NVUPEIPLNZNAPONC
1373:
0103BA2211MOVDX,1122
-T
AX=3344BX=0000CX=0000DX=1122SP=FFEEBP=0000SI=0000DI=0000
DS=1373ES=1373SS=1373CS=1373IP=0106NVUPEIPLNZNAPONC
1373:
0106058877ADDAX,7788
-T
AX=AACCBX=0000CX=0000DX=1122SP=FFEEBP=0000SI=0000DI=0000
DS=1373ES=1373SS=1373CS=1373IP=0109OVUPEINGNZNAPENC
1373:
010981D26655ADCDX,5566
-T
AX=AACCBX=0000CX=0000DX=6688SP=FFEEBP=0000SI=0000DI=0000
DS=1373ES=1373SS=1373CS=1373IP=010DNVUPEIPLNZNAPENC
1373:
010D0000ADD[BX+SI],ALDS:
;结果:
DX.AX=6688AACCH
五、拓展题:
1、编写程序段:
将DX.AX中的双字右移一位。
2、编写程序段:
将AX寄存器的最低4位置1,最高3位清0,第7、8、9位取反,其余位不变。
设AX中原来的值为0AAH。
3、设AX=2AH,BX=30H,编写程序段计算:
AX/BX,并将结果送BX.CX。
六、实验报告:
1、写出源程序段清单、程序说明、执行结果。
2、调试说明。
包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。
实验三汇编语言程序的调试与运行
一.知识点
1、汇编语言源程序的格式
完整的汇编语言源程序由段组成,即代码段、数据段、附加段和堆栈段。
其中,需要独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。
例如,输出一个字符串的源程序:
.modelsmall;定义程序的存储模式(小型程序一般采用小模式)
.stack;定义堆栈段
.data;定义数据段
stringdb‘Anexample.’,0ah,0dh,’$’;在数据段中定义要显示的字符串
.code;定义代码段
.startup;程序的起始点
leadx,string;将字符串的起始地址送dx,即设置入口参数
movah,09h;设置输出字符串的功能调用号
int21h;功能调用:
显示
.exit0;程序结束点,返回dos
end;汇编结束
注:
这是简化段定义的程序格式
2、汇编语言程序的开发过程
一般步骤:
编辑、编译、连接、调试运行
(1)源程序的编辑
源程序文件可以利用任一文本编辑器进行编辑,通常我们用“记事本”。
源程序文件保存时,一般以.asm为文件的后缀名。
具体实现:
如图
在win2000环境下,在“另存为”界面中输入文件全名(example.asm),并且将“保存类型“选择为“所有文件”。
也可以使用.txt后缀名,不过在汇编时要写源文件的全名,否则系统默认的为.asm。
(2)源程序的汇编、连接
汇编是将源程序翻译成由机器代码组成的目标模块文件的过程。
连接程序将一个或多个目标文件和库文件合成一个可执行文件。
MASM6.X提供的ML.EXE可以实现:
先汇编,若没有错误则自动调用LINK.EXE连接程序进行编译;若有错,则提示错误信息,可利用列表文件查看错误所在位置,并改正错误,重新汇编和连接。
例如,设上面的例题程序文件为EXAMPLE.ASM,并且该文件与ML.EXE等文件都在同一目录(设该目录为当前目录)下,则汇编、连接的命令为:
>MLEXAMPLE.ASM
运行结果见实验步骤2。
产生:
EXAMPLE.OBJ和EXAMPLE.EXE文件
特别说明:
ML允许汇编和连接多个程序形成一个可执行文件,而且还可以带参数,格式:
ML[/参数选项]文件列表
常用参数选项有:
/c——只汇编源程序,不进行自动连接(注意用小写字母c)
/Fl文件名——创建一个汇编列表文件(扩展名LST),用于查找错误。
Sg——在省城的列表文件中,列出由汇编程序产生的指令
例如:
若将字符串的引号改为中文的“‘”后重新用下面命令汇编连接,则结果见实验步骤3。
>ML/FlEXAMPLE.ASM
(3)可执行程序的调试
在操作系统提示符下直接输入柯执行文件名即可运行:
>EXAMPLE
当出现运行错误时,通常用DEBUG进行调试:
>DEBUGEXAMPLE.EXE
然后采用U命令进行反汇编,用T或G命令运行并观察,找出错误所在。
二.实验目的及要求
1.掌握数据定义、段定义的方法
2.熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。
3、熟悉常见Jcc指令、loop指令的使用。
三.实验内容
编程实现:
1、求数组array中的20个字元素的和,并存入变量total中。
其中,数组元素在定义数组时以初值的形式给出。
2、给DX送一个初值,然后判断:
若DX的高4位全为0,则使AX=0;否则使AX=-1。
3、定义一个字符串string,包含若干字符并且以’$’结尾,用程序统计字符的个数。
四、实验步骤
以实验内容1为例,介绍实验步骤:
1、编辑源程序:
在记事本中输入如下程序,并存在E:
\MASM6\BIN\EXAM1.ASM中。
2、汇编、编译:
情况1:
没有错误
>mlexample.asm
ObjectModules[.obj]:
example.obj
RunFile[example.exe]:
"example.exe"
ListFile[nul.map]:
NUL
Libraries[.lib]:
DefinitionsFile[nul.def]:
产生:
EXAMPLE.OBJ和EXAMPLE.EXE文件
情况2:
源程序中有错误,比如将字符串的引号改为中文的“‘”后重新用下面命令汇编连接。
>ML/FlEXAMPLE.ASM
Microsoft(R)MacroAssemblerVersion6.11
Copyright(C)MicrosoftCorp1981-1993.Allrightsreserved.
Assembling:
example.asm
example.asm(5):
errorA2044:
invalidcharacterinfile
example.asm(8):
errorA2006:
undefinedsymbol:
string
则给出2条错误信息提示,并产生错误列表文件EXAMPLE.LST
在记事本中打开该文件,内容如下:
;输出一个字符串的源程序:
.modelsmall
.stack
.data
stringdb’Anexample.',0ah,0dh,'$'
example.asm(5):
errorA2044:
invalidcharacterinfile
.code;定义代码段
.startup;程序的起始点
leadx,string
example.asm(8):
errorA2006:
undefinedsymbol:
string
movah,09h
int21h;功能调用:
显示
.exit0;程序结束点,返回dos
end;汇编结束
特别提示:
两处错误明显的标在源程序中。
实际上,只有一处错误,后面的错误是由于前面的错误引起的,所以改正错误时要从前往后逐个修改,并且每改完一处就重新存盘、汇编,以提高调试效率。
3、调试:
C:
\masm>debugexample.exe
-u;反汇编
1395:
0000BA9713MOVDX,1397
1395:
00038EDAMOVDS,DX
1395:
00058CD3MOVBX,SS
1395:
00072BDASUBBX,DX
1395:
0009D1E3SHLBX,1
1395:
000BD1E3SHLBX,1
1395:
000DD1E3SHLBX,1
1395:
000FD1E3SHLBX,1
1395:
0011FACLI
1395:
00128ED2MOVSS,DX
1395:
001403E3ADDSP,BX
1395:
0016FBSTI
1395:
00178D160400LEADX,[0004];源程序中的第一条指令
1395:
001BB409MOVAH,09
1395:
001DCD21INT21
1395:
001FB8004CMOVAX,4C00;对应.exit0指令
-u
1395:
0022CD21INT21
……
此时可用debug命令调试该程序了。
4、关于变量名对应的偏移地址
源程序的第一条指令是:
leadx,string
汇编后对应的指令是:
LEADX,[0004]
因此,可看出变量string所对应的偏移地址是:
0004h
如果要查看从string开始的字符串的内容,可用如下命令:
-D04Lc
即查看从04H开始