汇编语言程序设计实验指导书.docx
《汇编语言程序设计实验指导书.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计实验指导书.docx(62页珍藏版)》请在冰点文库上搜索。
汇编语言程序设计实验指导书
实验一DEBUG的使用
实验目的:
1.学习使用DEBUG程序的各种命令。
2.掌握8088/86指令系统---算数指令。
3.掌握用DEBUG调试自编程序的方法。
4.掌握8088/8086CPU寄存器的用途和存储器组织及它们之间的关系。
5.掌握内存操作数及寻址方法。
6.掌握汇编语言伪操作:
BYTEPTR,WORDPTR。
内容及步骤:
一、DEBUG命令使用:
1、敲DEBUG进入DEBUG环境,显示提示符'_'。
2、用命令D10010F观察内存中的16进制码及屏幕右边的ASCII字符。
3、用命令E100303132……3F将30H~3FH写入地址为100H开始的内存单元中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?
4、用命令F10010F'A'将'A'的ASCII码填入内存,用D命令查看结果。
5、用命令F11011F41将41H填入内存,用D命令观察结果并比较。
6、用R命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。
7、用R命令将AX,BX内容改写为1234H及5678H。
8、用H命令检查下列各组16进制数加减结果并和你的手算结果比较:
(1)34H,22H
(2)56H,78H(3)A5,79H(4)1284H,5678H(5)A758,347FH
二、8088常用指令练习
1、传送指令
1)用A命令在内存100H处键入下列内容:
MOVAX,1234
MOVBX,5678
XCHGAX,BX
MOVAH,34
MOVAL,56
MOVCX,75AB
XCHGAX,CX
2)用U命令检查键入的程序,特别注意左边的机器码。
3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。
并注意标志位有无变化。
2、加减法指令:
1)用A命令在内存200H处键入下列内容:
MOVAH,34
MOVAL,2E
ADDAL,AH
SUBAL,78
MOVCX,1234
MOVDX,5678
ADDCX,DX
SUBCX,AX
SUBCX,CX
2)用U命令检查键入的程序及对应的机器码。
3)用T命令逐条运行这些指令,检查并记录有关寄存器及ZF情况。
思考题:
这次运行还是打入T,行不行?
如何单步运行上述小程序?
用R命令检查一下IP的内容。
注意T命令与IP的关系。
3、带进位加减法:
1)用A命令在内存300H处键入下列内容,并用U命令检查:
MOVAH,12
MOVAL,89
MOVCH,56
MOVCL,98
ADDAL,CL
ADCAH,CH
MOVDH,A7
MOVDL,58
SUBDL,7F
SBBDH,34
2)用T命令逐条运行这些指令,检查并记录有寄存器及CF内容。
3)上面这段程序若改用16位操作指令达到同样结果,怎么改?
试修改并运行之。
4、BCD码加减法
1)内容:
MOVAL,58
ADDAL,25
DAA
2)要求:
用A命令键入,U命令检查,T命令逐条运行并记录有关寄存器及AF内容。
三、内存操作数及各种寻址方式使用:
1)用A命令在内存400H处键入下列内容,并用U命令检查:
MOVAX,1234
MOV[1000],AX
MOVBX,1002
MOVBYTEPTR[BX],20
MOVDL,39
INCBX
MOV[BX],DL
DECDL
MOVSI,3
MOV[BX+SI],DL
MOV[BX+SI+1],DL
MOVWORDPTR[BX+SI+2],2846
2)用T命令逐条运行这些指令,每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。
注意:
D命令显示结果中右边的ASCII字符及双字节数存放法。
思考题:
有关指令中BYTEPTR及WORDPTR伪操作不加行不行?
试一试。
四、DEBUG下汇编运行程序方法
用A命令汇编程序,编程完成将DS:
1000开始的10个字节的内存单元的内容相加,并把相加结果存放在DS:
200A内存单元中,用DEBUG调试运行该程序,并察看运行结果。
内容:
MOVCX,0AH
MOVAL,0
MOVBX,1000
LL:
ADDAL,[BX]
INCBX
DECCX
JNZLL
MOV[BX],AL
INT3
步骤:
1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LL的实际地址,在键入JNZ指令时LL用实际地址值代替。
2)用U命令检查键入的程序及对应的机器码。
3)用E10000102030405060708090A将1000H开始的前10个内存单元的内容修改为01,02,03,04,05……0A,用D命令查看修改结果。
4)用T命令逐条运行上述小程序指令,检查并记录有关寄存器、存储单元内容及ZF情况。
5)用F2000l0A02030405……0B将1000H开始的10个内存单元的内容修改为02,03,04,05……0B。
用D命令查看修改结果。
6)用G=100全速运行上述小程序,用D1000100F查看运行结果。
思考题:
可否随意在DEBUG提示符“-”后不带参数发出命令G?
什么情况下使用命令G时,可不用“=”给出执行的首地址?
实验报告:
1、列出8088常用指令练习部分的逐条运行记录。
2、列出DEBUG下调式运行小程序的运行步骤和运行结果。
3、回答思考题。
附:
DEBUG使用:
1、打DEBUG进入DEBUG,显示提示苻'_'。
2、退出DEBUG命令:
Q
3、显示内存命令:
D起始地址结束地址
4、修改内存命令:
E起始地址,连续修改打空格键。
打回车键退出E命令。
5、检查寄存器命令:
R
标志位显示10
CFCYNC
ZFZRNZ
SFNGPL
AFACNA
OFOVNV
PFPEPO
DFDNUP
IFEIDI
6、修改寄存器命令:
R寄存器名
7、小汇编命令:
A起始地址,不输入指令打回车键退出A命令。
8、反汇编命令:
U起始地址结束地址
9、文件命名命令:
N盘号:
文件名
10、读文件命令:
L内存地址
11、写文件命令:
W内存地址
10、读扇区命令:
L内存地址盘号(0--A:
1--B:
)扇区号扇区数
11、写扇区命令:
W内存地址盘号扇区号扇区数
12、运行命令:
G=起始地址结束(断点)地址
13、单步命令:
T=起始地址运行指令数,进入子程序内部。
14、单步命令:
P=起始地址运行指令数,不进入子程序内部。
15、内存搬家命令:
M起始地址结束地址目的地址
实验二汇编语言程序结构
实验目的:
1、掌握汇编语言程序结构。
2、掌握建立、汇编、链接、调试和运行汇编程序的过程。
3、掌握伪指令:
SEGMENT,ENDS,ASSUME,END,OFFSET,DUP。
4、了解.EXE文件和.COM文件的区别及用INT21H4C号功能返回系统的方法。
5、熟悉加法调整指令意义及其用法。
实验内容:
一、多字节加法程序。
对两个多位十进制数求和,加数和被加数分别存放在D1和D2开始的数据缓冲区中,相加结果存放在D1开始的单元中(D1和D2均为字节变量,分别存储着压缩BCD数)。
<参考程序>
DATASEGMENT
D1DB12H,34H,56H,78H
D2DB56H,27H,38H,49H,
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADI,D1
MOVCX,4
LEASI,D2
MOVBX,4
CLC
LOP:
MOVAL,[DI+BX-1]
ADCAL,[SI+BX-1]
DAA
MOV[DI+BX-1],AL
DECBX
LOOPLOP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
步骤:
1)从开始菜单/程序/附件选则c:
\命令提示符进入DOS环境。
2)敲cd\退回到根目录。
3)敲cd\masm进入masm子目录。
4)敲dir列出masm目录下文件。
5)敲edit进入全屏幕编辑环境,输入以上程序,存盘命名退出(如abc.asm)。
6)敲masmabc.asm汇编源程序,如无语法错误就会生成abc.obj形式的二进制目标代码文件,如有错误就回到全屏幕编辑环境修改错误,再重新汇编,直到汇编通过为止。
7)敲linkabc.obj链接二进制目标代码文件,生成abc.exe文件。
8)敲DEBUGabc.asm调入DEBUG和文件abc.exe,然后用U命令检查调入程序。
9)用命令G=100J(J用实际地址代替),使程序运行并停在断点J处,检查内存单元的内容是否是预期的结果。
二、把上题改造成COM文件的编程格式,汇编、链接和运行调试该程序。
三、用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同题一。
调试并做记录。
实验说明:
压缩型十进制数就是用四位二进制数表示一个十进制数位,如:
十进制数39表示为0011,1001,非压缩型十进制数即拆开型十进制数,它是用8位二进制数表示一个十进制数位,如:
十进制数39表示为0000,0011,0000,1001。
思考题:
1)若在源程序中把INT21H的'H'省去,会产生什么现象?
2)把INT21H4CH号功能改为INT20H,行不行?
实验报告:
1、列出自编程序的程序清单,并加适当注释。
2、写出汇编,连接及调试程序时产生的错误,其原因及解决办法。
3、总结EXE文件和COM文件的编程格式。
4、回答思考题。
实验三数据串传送和比较
实验目的:
通过实验掌握下列知识:
1、堆栈。
堆栈指示器SP和堆栈操作指令PUSH、POP。
2、数据串传送程序和数据串传送指令MOVS、STOS及重复前辍REP。
3、数据串比较指令CMPSB及重复前缀REPZ。
4、循环指令ROL。
逻辑与指令AND和清方向位指令CLD。
5、利用汇编集成环境编辑运行自编程序的方法。
实验内容:
一、利用查表方法把DX的内容(16进制数)转换成ASCII码:
<参考程序〉
DATASEGMENT
D1DB‘0123456789ABCDEF’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES:
AX
MOVDX,6C8EH
LEABX,D1
MOVDI,2000H
MOVCX,4
LOP:
PUSHCX
MOVCL,4
ROLDX,CL
POPCX
MOVAL,DL
ANDAL,OF
XLAT
CLD
STOSB
LOOPLOP
INT20H
CODEENDS
ENDSTART
步骤:
1、进入windows桌面,点击“我的电脑”,进入C盘,找到CMASM2文件夹打开,点击CMASM.EXE进入汇编集成环境。
2、按任意键进入主菜单,选择1建立源程序文件名(不需送扩展名)。
如图3.1所示。
图3.1汇编集成环境
3、选择2进入全屏幕编辑环境,送入汇编源程序,存盘退出。
如图3.2所示。
图3.2全屏幕编辑环境
4、选择3产生EXE文件(包括汇编和链接过程),如有语法错误,返回2查找和修改错误,存盘退出,再重新产生EXE文件,直到成功为止。
如图3.3所示。
图3.3汇编和链接
5、选择5进入DEBUG环境,调式运行该程序。
图3.4DEBUG动态调试环境
6、用T命令逐条运行这程序到LOOP指令处,观察并记录每次运行结果,特别是SP和堆栈内容(用D命令检查)
7、用G命令将此程序运行到结束,并用D命令检查2000H处所转换的结果。
可注意屏幕右边的ASCII字符与DX是否一致。
思考题:
1、为什么不选择4直接运行该程序,而进入DEBUG运行调式该程序?
2、程序中不设附加段可不可以?
二、段寄存器概念及字符串传送指令练习:
1、用A命令键入下列程序:
MOVSI,0
MOVDI,0
MOVAX,1000
MOVDS,AX
MOVAX,1500
MOVES,AX
MOVCX,0F
CLD
REPMOVSB
INT20
2、用A命令DB伪指令在1000:
0000处键入字符串'IBM_PCCOMPUTER',并用D命检查之
3、用D命令检查0F00:
1000处内容,看是否一样。
为什么?
4、用G命令运行此程序,检查目的地址1500:
0000处内容。
并记下DS与ES值。
5、修改此程序,使ES与DS为同一值,以减少一条指令,而源物理地址和目的物理地址(是多少?
)仍和原来一样。
三、数据串搬家程序:
编程实现把字符串“Welcometolaboratory!
”从源缓冲区传送到目的缓冲区。
在DEBUG下用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致。
实验报告要求:
1、各项实验记录和思考题。
2、调式通过的自编程序清单和调试记录。
实验四屏幕字符显示
实验目的:
通过实验掌握下列知识:
1、利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法。
2、利用DOS功能调用INT21H的)0AH号功能从键盘输入数据的方法。
3、直接向视频RAM(VRAM)送ASCII码进行屏幕显示的方法。
4、IBM-PC机的ASCII码表及控制字符。
5、利用^Break退出程序的方法及局限性。
实验内容及步骤:
一、利用INT21H的09H号功能调用显示字符串。
<参考程序>
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE
ORG100H
START:
JMPBEGIN
MSGDB‘HELLO,WELCOMETOASSEMBLEERWORLD!
’13,10,’$’
BEGIN:
MOVAX,CS
MOVDS,AX
MOVDX,OFFSETMSG
MOVAH,09H
INT21H
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
步骤:
1、进入汇编集成环境输入上述程序,存盘退出编辑环境。
2、汇编链接该程序产生.COM文件。
3、运行该程序,观察结果。
二、利用INT21H0AH号功能显示从键盘输入的字符串。
<参考程序>
DATASEGMENT
BUF1DB‘Pleaseinputastring:
’,0dh,0ah,’$’
BUF2DB80
DB?
DB81DUP(?
)
BUF3DB0DH,0AH,’$’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADX,BUF1
MOVAH,09H
INT21H
MOVDX,BUF2
MOVAH,0AH
INT21H
MOVCL,STR1+1
MOVCH,0
MOVSI,OFFSETSTR1+2
ADDSI,CX
MOVBYTEPTR[SI],'$'
MOVDX,OFFSETBUF3
MOVAH,09H
INT21H
MOVDX,OFFSETBUF2+2
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
步骤:
1、进入汇编集成环境输入上述程序,存盘退出编辑环境。
2、汇编链接该程序产生.EXE文件。
3、运行该程序观察结果。
三、利用INT21H2号功能显示字符:
<参考程序>
CODESEGMENT
ASSUMECS:
CODE
START:
XORDL,DL
MOVCX,100H
LOP:
MOVAH,2
INT21H
INCDL
PUSHCX
MOVCX,8
DELY:
PUSHCX
MOVCX,0
J:
LOOPJ
POPCX
LOOPDELY
POPCX
LOOPLOP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
步骤:
1、进入汇编集成环境输入上述程序,存盘退出编辑环境。
2、汇编链接该程序产生.EXE文件。
3、运行该程序,屏幕上依次缓慢的显示256个ASCII字符。
仔细观察每个字符,和IBM-PCASCII码表对照,看07H-0DH处控制字符显示结果与表上有何不同?
4、按CTRL+BREAK退出此程序,若一次不行可多做几次。
四、直接向VRAM送ASCII码显示字符
<参考程序>
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAX,B800H
MOVDS,AX
XORAL,AL
XORBX,BX
MOVCX,100
LOP:
MOV[BX],AL
INCBX
INCAL
PUSHCX
MOVCX,8
DELY:
PUSHCX
MOVCX,0
J:
LOOPJ
POPCX
LOOPDELY
POPCX
LOOPLOP
INT20H
CODEENDS
ENDSTART
步骤:
1、进入汇编集成环境输入上述程序,存盘退出编辑环境。
2、汇编链接该程序产生.EXE文件。
3、运行该EXE文件,仔细观察每一个ASCII码显示结果,并和字符表及上一道程序运行情况进行对照,其控制字符区(07-0DH)显示结果和INT21H2号功能调用有何不同?
五、自编程序
1、要求显示AX的内容,即能显示AX=xxxx。
2、编程实现:
屏幕显示“Pleasesetthepassword!
”,随后从键盘输入设定的密码,屏幕接着显示“Pleasesetthepasswordagain!
”,如果再次输入的密码和第一次输入的相同则显示“OK,WELCOMETOASSEMBLEWORLD!
”,否则显示“Passworderror!
”。
实验报告要求:
1、各项实验记录。
2、利用INT21H显示和直接向VRAM送ASCII码显示方法在显示结果上有什么不同?
3、调试通过的自编程序清单及调试结果。
实验五条件转移和分支程序
实验目的:
通过实验掌握下列知识:
1、8088指令:
JZ,JNZ,JC,JNC,CMP,SHR。
2、用字符搜索法确定字符串长度。
3、16进制数化为ASCII码的一般方法。
4、掌握利用间接转移指令JMPBX实现多岔分枝的方法。
5、宏替换指令MACRO及ENDM。
6、符号扩展指令CBW。
实验内容:
一、用字符搜索法确定字符串长度:
<参考程序>
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE
ORG100H
START:
JMPBEGIN
MSGDB'Thisistheprogramtomeasure'
DB'thelengthofastring!
$'
BEGIN:
MOVAX,CS
MOVDS,AX
LEABX,MSG
MOVAL,24
XORCL,CL
LOP:
CMPAL,[BX]
JZEXIT
INCBX
INCCL
JMPLOP
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
汇编、连接和运行此程序,并检查CL的统计长度是否与你自己统计的实际长度是否一样?
二、16进制数化ASCII码的一般方法(显示内存内容)
<参考程序>
CODESEGMENT
ASSUMECS:
CODE
START:
MOVSI,0
MOVBL,10H
LOP:
MOVDL,[SI]
MOVCL,4
SHRDL,CL
CMPDL,0AH
JCL1
ADDDL,7
L1:
ADDDL,30
MOVAH,2
INT21H
MOVDL,[SI]
ANDDL,0FH
CMPDL,0AH
JCL2
ADDDL,7
L2:
ADDDL,30H
MOVAH,2
INT21H
MOVDL,20H
MOVAH,2
INT21H
INCSI
DECBL
JNZLOP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
汇编、连接和运行此程序,观察结果。
三、综合程序:
编程测量一字符串长度,并用16进制数显示之
四、分支程序:
已知CHR单元有一个二进制数X,编程计算Y,其结果存入RESULT单元中。
Y=
实验报告要求:
1、列出调试通过程序清单并加注释。
2、写出实验体会。
实验六循环程序
实验目的:
1、掌握循环程序设计的方法和技巧。
2、掌握双重循环程序的结构,明晰内外循环层次。
3、掌握排序程序设计方法。
实验内容:
1、将一个十六位二进制数逐位显示输出。
<参考程序>
CODESEGMENT
ASSUMECS:
CODE
BEGIN:
MOVBX,1011000101010111B
MOVCL,16
ROLT:
ROLBX,1
JCDISP
MOVAH,2
MOVDL,30H
INT21H
DISP:
MOVAH,2
MOVDL,31H
INT21H
NEXT:
DECCL
JNZROTL
MOVAH,2
MOVDL,’B’
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDBEGIN
汇编、连接和运行此程序,观察结果。
二、将一批无序的字数组元素按照从小到大的次序进行排序输出。