微机原理及汇编语言程序设计实验指导书.docx
《微机原理及汇编语言程序设计实验指导书.docx》由会员分享,可在线阅读,更多相关《微机原理及汇编语言程序设计实验指导书.docx(23页珍藏版)》请在冰点文库上搜索。
微机原理及汇编语言程序设计实验指导书
微机原理及汇编语言
程序设计
实
验
指
导
书
计算机实验中心
目录
实验一DEBUG的使用142
实验二数制转换程序146
实验三数组排序程序147
实验四数据的输入与输出程序149
实验五子程序设计150
实验六宏调用程序设计151
实验一DEBUG的使用
【实验目的】
1.学习使用DEBUG调试程序的各种命令。
2.掌握8088/8086指令系统---数据传送指令、算术指令。
3.掌握用DEBUG调试程序的方法。
4.掌握8088/8086CPU寄存器的用途和存储器组织及它们之间的关系。
5.掌握内存操作数及寻址方法。
6.掌握汇编语言伪操作:
BYTEPTR,WORDPTR。
7.熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。
8.掌握数据传送、算术运算、BCD码调整和循环指令的用法,掌握字符显示的方法。
【实验性质】
验证性实验(学时数:
2H)
【实验内容】
一、DEBUG命令的使用
1.敲DEBUG进入DEBUG环境,显示提示符'_'。
2.用命令D10010F观察内存中的16进制码及屏幕右边的ASCII字符。
3.用命令E100303132……3F将30H~3FH写入地址为100H开始的内存单元
中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?
4.用命令F100L0F'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/8086常用指令练习
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:
100A内存单元中,用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时,可不用“=”给出执行的首地址?
五、两个多位十进制数相加
要求:
将下面程序在汇编平台下,完整地进行汇编、连接、运行,然后用DEBUG软件调入可执行文件到内存,用反汇编命令查看实际程序及数据区内容,用t命令逐条执行,以观察各寄存器及数据区内存的数据变化情况,然后使用p命令和g命令执行,以观察执行过程有何特点。
将两个5位十进制数相加,要求被加数(本题选47193)和加数(本题选28056)均以ASCII码形式各自顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回以DATA3为首的5个内存单元中(低位在前),并显示相加的结果。
实验程序和结果如下:
DATASEGMENT
DATA1DB33H,39H,31H,37H,34H;存放被加数47193,ASCII码形式,低位在前
DATA2DB36H,35H,30H,38H,32H;存放加数28056,ASCII码形式,低位在前
DATA3DB5DUP(?
);留出5个存放结果的单元
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVCX,5;循环次数置5,5个位要相加5次
MOVSI,0;SI放地址位移量,每个数的第一字节地址位移量为0
CLC;CF清0,防止第1个字节相加时ADC指令多加CF中可能的1
NEXT:
MOVAL,DATA1[SI];取被加数一个字节送AL,DATA1偏移地址+SI为有效地址
ADCAL,DATA2[SI];AL+加数对应字节+CF(低位相加时可能的进位)结果送AL
AAA;AL中两字节相加的和调整成非压缩的BCD码,进位在CF中
MOVDATA3[SI],AL;结果送入DATA3对应字节单元中
INCSI;地址位移量加1指向高一位字节单元
LOOPNEXT;5次未到,继续循环
MOVSI,5;显示5个位,SI中的数既是循环次数又作地址位移量
DISP:
ADDDATA3[SI-1],30H;将结果从高位单元开始把非压缩的BCD码变成ASCII码
MOVDL,DATA3[SI-1];将ASCII码送DL以满足2号功能调用的规定要求
MOVAH,2;功能号送AH
INT21H;调用2号功能,显示一位数字
DECSI;次数减1
JNZDISP;5次未到,继续循环
MOVAH,4CH;功能号送AH
INT21H;调用4CH号功能,返回DOS
CODEENDS
ENDSTART
运行结果:
75249
思考题:
1.上述程序只显示了相加的结果,没有显示被加数和加数,如果在上述程序的基础上将显示格式改为47193+28056=75249,则程序如何修改?
2.上述程序没有考虑运算结果最高位有进位的情况,如果考虑可能产生的进位,则要显示完整的结果,程序如何修改?
(提示:
INC和LOOP指令均不影响CF)
【报告要求】
1.列出8086常用指令练习部分的逐条运行记录。
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.掌握DOS功能调用INT21H02号功能字符显示输出方法。
4.掌握INT21H4C号功能返回系统的方法。
【实验性质】
验证性实验(学时数:
2H)
【实验内容】
一、完成一个十六位二进制数到十六进制数的转换操作程序设计。
参考程序:
;将二进制数一边转换成十六进制数一边显示(用2号功能调用)
DATASEGMENT
BUFADW1111001000110100B;F234H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
BEG:
MOVAX,DATA
MOVDS,AX
MOVDX,BUFA
MOVCH,4;循环控制十六进制数显示位数
MOVCL,4
ROTATE:
ROLDX,CL;循环左移4位,将高位十六进制数移到低位
MOVBX,DX;保护移动后的数
ANDDX,0FH;屏蔽掉高位保留该低位数
CMPDL,9
JGL
ADDDL,30H;转换成ASCII码
MOVAH,2;送显示
INT21H
JMPNEXT
L:
ADDDL,37H
MOVAH,2
INT21H
NEXT:
MOVDX,BX
DECCH
JNZROTATE
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
二、把上题改造成COM文件的编程格式,汇编、链接和运行调试该程序。
参考程序:
CODESEGMENT
ASSUMECS:
CODE
ORG100H
BEG:
JMPSTART
BUFADW0001001000110100B;1234H(用户程序数据区)
START:
MOVDX,BUFA
MOVCH,4;循环控制十六进制数显示位数
MOVCL,4
ROTATE:
ROLDX,CL;循环左移4位,将高位十六进制数移到低位
MOVBX,DX;保护移动后的数
ANDDX,0FH;屏蔽掉高位保留该低位数
CMPDL,9
JGL
ADDDL,30H;转换成ASCII码
MOVAH,2;送显示
INT21H
JMPNEXT
L:
ADDDL,37H
MOVAH,2
INT21H
NEXT:
DECCH
MOVDX,BX
JNZROTATE
MOVAH,4CH
INT21H
CODEENDS
ENDBEG
三、参照上述程序完成一个十六位二进制数到十进制数的转换操作程序设计。
四、加分题:
完成从键盘输入一个任意十六位二进制数到十六进制数的转换操作程序设计。
提示:
在数据区定义19个字节的字符串区,用INT21H的10#功能,进行字符串输入,判断实际输入的字节数是否为16个,每个字节的内容是否为30H或31H,不是,则提示重新输入或退出,是,则把该区域的16个ASCII码30H、31H的字符从低位到高位(或相反顺序)转换成1010110101110111的形式,用上述程序进行转换输出。
思考题:
1)若在源程序中把INT21H的'H'省去,会产生什么现象?
2)把INT21H4CH号功能改为INT20H,行不行?
3)从键盘输入的二进制ASCII字符串,在转换成十六进制数据时,有哪几大步骤?
【实验要求】
1.列出自编程序的程序清单,并加适当注释。
2.写出汇编,连接及调试程序时产生的错误,其原因及解决办法。
3.总结EXE文件和COM文件的编程格式。
4.回答思考题。
实验三数组排序程序
【实验目的】
1.循环控制条件的设计。
2.存储器操作数的寻址方式。
3.对内存的数据处理方法。
【实验性质】
验证性实验(学时数:
3H)
【实验内容】
1、在内存缓冲区存放10个无序整数,按照从小到大的顺序进行排序,用debug查看排序结果。
参考程序:
DATASEGMENT
ST_ADDW23,78,45,99,128,64,32,200,1,0
DATAENDS
PROGRAMSEGMENT
MAINPROCFAR
ASSUMECS:
PROGRAM,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVCX,10
DECCX
LOOP1:
MOVDI,CX
MOVBX,0
LOOP2:
MOVAX,ST_AD[BX]
CMPAX,ST_AD[BX+2]
JGECOTINUE
XCHGAX,ST_AD[BX+2]
MOVST_AD[BX],AX
COTINUE:
ADDBX,2
LOOPLOOP2
MOVCX,DI
LOOPLOOP1
RET
MAINENDP
PROGRAMENDS
ENDSTART
2、加分题:
从键盘输入10个无序10进制整数,对这10个数进行排序,将排序后的结果送屏幕显示。
3、加分题:
从键盘输入一个10进制整数,插入前面已整序的10个数中,要求插入后的11个数也是整序好的,将插入后的结果送屏幕显示。
【报告要求】
1.给出该程序的流程图。
2.给出调试通过的自编程序清单和调试记录
3.写出实验体会。
实验四数据的输入与输出程序
【实验目的】
1.掌握键盘输入字符的方法和十六进制数字字符的ASCII码转换为二进制数的原理。
2.掌握子程序定义和调用的方法。
3.掌握循环移位指令的用法和无符号数比较大小的方法。
【实验性质】
验证性实验(学时数:
2H)
【实验内容】
从键盘上输入4位十六进制数,将其转换为16位二进制数并在显示器上显示出来。
要求输入的数字字符串以回车键结束。
如果输入的数字超过4个,则以最后输入的4个为准。
若按下的键不是十六进制数字字符,则显示出错信息。
参考程序:
【实验提示】
从键盘上输入的十六进制数字字符进入计算机后并不是相应的十六进制数或二进制数,而是与字符对应的ASCII码,现要找出ASCII码与该数字对应的二进制数之间的关系。
关系如下:
十六进制数字字符
字符对应的ASCII码
数字对应的二进制数
0~9
30H~39H
ASCII码-30H
A~F
41H~46H
ASCII码-37H
a~f
61H~66H
ASCII码-57H
【报告要求】
1.给出该问题的程序设计流程图。
2.给出该程序的全部代码,并加上注释。
3.总结实验体会。
实验五子程序设计
【实验目的】
掌握一般子程序的调用和返回方法,掌握定义过程的伪指令的用法。
【实验性质】
设计性实验(学时数:
3H)
【实验内容】
1、完成两个四位十进制数相加的程序设计,形式为:
2345+7869=10214
(1)要求所有中断调用全部采用子程序的形式完成。
(2)要求考虑进位位。
完善程序并调试通过。
(3)仿照下述程序,完成八位十进制数相加的程序设计。
要求考虑进位位。
完善程序并调试通过。
参考程序:
DISPMACROVAR
MOVAH,2
MOVDL,VAR
INT21H
ENDM
DATASEGMENT
STR1DB'PLEASEINPUTANUMBER(EXP:
2345)$'
STR2DB'PLEASEINPUTANOTHERNUMBER(EXP:
7868)$'
STR3DB0DH,0AH,'$'
BUF1DB10,?
11DUP(?
)
BUF2DB10,?
11DUP(?
)
BUF3DB4DUP(?
),'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
BEGIN:
MOVAX,DATA
MOVDS,AX
MOVDI,OFFSETSTR1
CALLDISPL;SHOW'PLEASEINPUTNUMBER1:
'
MOVDI,OFFSETBUF1
CALLGETNUM;GETNUMBER1FROMKEYBOARD
MOVDI,OFFSETSTR3
CALLDISPL;CRLF
MOVDI,OFFSETSTR2
CALLDISPL;SHOW'PLEASEINPUTNUMBER2:
'
MOVDI,OFFSETBUF2
CALLGETNUM;GETNUMBER2FROMKEYBOARD
MOVDI,OFFSETSTR3
CALLDISPL;CRLF
XORBX,BX
MOVBL,BUF1+1
MOVBUF1+2[BX],'$';BEHINDNUMBER1ADD'$'
MOVDI,OFFSETBUF1+2
CALLDISPL;SHOWNUMBER1
DISP'+';SHOW'+'
XORBX,BX
MOVBL,BUF2+1
MOVBUF2+2[BX],'$';BEHINDNUMBER2ADD'$'
MOVDI,OFFSETBUF2+2
CALLDISPL;SHOWNUMBER2
DISP'=';SHOW'='
LEASI,BUF1+2
LEADI,BUF2+2
CALLDAAD;ADDNUMBERS
MOVDI,OFFSETBUF3
CALLDISPL;SHOWRESULT
MOVAH,4CH;RETURNDOS
INT21H
DAADPROCNEAR;SUBPROCESSOFADD
MOVBX,4
N1:
MOVAL,[SI+BX-1]
ADCAL,[DI+BX-1]
AAA
ADDAL,30H
MOVBUF3[BX-1],AL
DECBX
JNZN1
RET
DAADENDP
DISPLPROCNEAR;SUBPROCESSOFDISPLAY
MOVAH,9
MOVDX,DI
INT21H
RET
DISPLENDP
GETNUMPROCNEAR;SUBPROCESSOFGETNUM
MOVAH,0AH
MOVDX,DI
INT21H
RET
GETNUMENDP
CODEENDS
ENDBEGIN
2、加分题:
根据输入的运算符来实现+、-、*、/四则运算,并考虑进位。
做除运算时,应考虑除数为0。
【实验要求】
1.设计一个子程序,完成将缓冲区中的两个四位十进制数据送屏幕显示功能。
2.设计一个子程序,完成从键盘输入两个四位十进制数的加法操作程序设计。
3.设计一个子程序,完成两个八位十进制数作的加法运算操作程序设计。
4.设计一个子程序,完成两个四位十进制数作四则运算操作。
运算要求从键盘输入。
【报告要求】
1.给出该程序设计的方案步骤。
2.列出自编程序清单并加注释。
3.写出心得体会。
实验六宏调用程序设计
【实验目的】
1.熟悉宏定义的一般结构。
2.掌握宏指令的编写方法和调用方法。
3.能区别宏调用和子程序调用的不同之处。
4.了解LOCAL伪操作的用法。
5.熟悉无参数宏指令和有参数宏指令的定义与调用。
【实验性质】
验证性实验(学时数:
2H)
【实验内容】
1.设计一个子功能,完成显示一串文字信息。
2.设计一个子功能,能实现多个字或字节10进制数据连加或连减的功能。
要求多字节10进制数据从屏幕输入。
加或减按实际输入的符号决定。
参考