王建霞微机原理实验指导书DOC.docx
《王建霞微机原理实验指导书DOC.docx》由会员分享,可在线阅读,更多相关《王建霞微机原理实验指导书DOC.docx(45页珍藏版)》请在冰豆网上搜索。
王建霞微机原理实验指导书DOC
《微机原理》实验指导书
王建霞
河北科技大学信息学院
2005年3月
前言
本指导书结合教材《微型计算机原理及应用》的内容以及本、专科生实验大纲的要求编制。
软件实验中给出了程序框图和主要程序清单。
硬件实验中给出了硬件结构图及连线图。
其中程序清单仅仅是为了学生编程序时作为参考用的,学生在做实验前,必须充分预习,自己编制程序,才能准予上机做实验。
本指导书中除了大纲中规定必做的实验外,还给大家提供了一些有实用性的选做实验。
以满足课外自由实验上机学生的要求。
本实验指导书内容较丰富、系统,除可以作为计算机专业大学本科实验指导书外,也可以作为非计算机专业的研究生学习微型计算机的实验指导书,也可作为各类型的微型计算机培训班的实验指导书。
本实验指导书由王建霞、靳玉福、陈义峰老师编写,因水平有限,难免有不足之处,请老师同学多提宝贵意见。
编者于2005.3
目录
实验一Debug练习及汇编语言程序的建立和运行……………………(4)
实验二两个多位十进制数相加的实验…………………………………(11)
实验三十进制数乘除运算编程…………………………………………(15)
实验四 排序实验…………………………………………………………(23)
实验五系统认识实验……………………………………………………(30)
实验六存储器扩展实验…………………………………………………(35)
实验一Debug练习及汇编语言程序的建立和运行
一、预习内容
用debug建立和运行汇编语言程序
debug是调试汇编语言程序的工具,它不仅能跟踪程序的运行,还可显示修改内存与寄存器内容,以便在调试程序中检查程序,找错,改错;它还支持小汇编,直接对小段程序进行汇编;也可对盘进行读写操作。
但debug不宜汇编较长的程序,不便于分块程序的设计,不能使用绝大多数ASM和MASM提供的伪指令。
debug的进入是DOS状态下键入debug文件名,便进入debug状态,在debug的提示符“—”下键入debug命令。
C>debug↙
debug命令以单个字母的命令符开头,然后是命令操作参数,操作参数与操作参数之间,用空格或逗号分开,操作参数与命令符之间用空格隔开,命令的结束符是回车键↙。
命令及参数的输入可以是大小写的结合,CtrL+break键中止命令的执行。
debug下所用的数均为十六进制数,且不必写H。
debug的常用命令有:
1.汇编命令A
格式:
(1)A<段寄存器名>:
<位移>
(2)A<段地址>:
<位移>
(3)A<位移>
(4)A
功能:
键入该命令后显示段地址和位移并等待用户从键盘逐条键入汇编命令,逐条汇编成代码指令,直到显示下一地址时用户直接键入回车键返回到提示符“—”。
其中
(1)用指定寄存器内容作段地址,(3)用CS内容作段地址,(4)用CS:
0100作地址。
以后其它命令中提及的各种“地址”形式,均为
(1)、
(2)、(3)中A后的地址形式。
2.反汇编命令U
格式1:
U<地址>
格式2:
U<地址范围>
功能:
将指定范围内的代码以汇编语句形式显示,同时显示地址及代码。
注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果。
地址及范围的缺省值是上次U指令后下一地址的值。
这样可以连续反汇编。
3.显示内存命令
格式:
(1)D<地址>;以CS为段寄存器
(2)D<地址范围>
(3)D;显示CS:
0100起始的一片内容。
功能:
以两种形式显示指定内存范围内容。
一种形式为十六进制内容,一种形式为相应字节的ASCII码字符,对不可见字符以“·”代替。
4.修改内存命令E
格式:
(1) E<地址><单元内容>
(2)E<地址><单元内容表>
功能:
(1)将指定内容写入指定单元后显示下一地址,可连续键入修改内容,直到新地址出现后键入↙为止。
(2)将<单元内容表>逐一写入由<地址>开始的一片单元。
5.填充内存命令F
格式:
F<地址范围><单元内容表>
功能:
将单元内容表中的值逐个填入指定范围,单元内容表中内容用完后重复使用。
例如:
—F12FF:
00000100A↙
—D12FF:
00000100↙
6.显示并修改寄存器命令R
格式1:
R
格式2:
R<寄存器名>
功能:
格式1显示当前所有寄存器内容,状态标志及将要执行的下一指令的地址,代码及汇编语句格式。
其中对状态标志FLAG以每位的形式显示。
格式2显示指定寄存器内容。
例如:
RIP↙
7.单步执行并显示系统环境T
格式:
T[=<地址>][<条数>]
功能:
<地址>的缺省值是当前IP值,<条数>的缺省值是一条。
执行由指定地址起始的<条数>指定的若干条指令。
例如:
—T;执行当前指令并显示状态
—T10;从当前指令始执行10H条指令。
8.连续执行命令G
格式:
(1)G=<起始地址><断点地址>
(2)G<结束地址>;从IP指向的地址开始执行程序到结束地址。
9.退出debug命令Q
—Q↙;进入DOS状态下
C>
例如:
利用串操作传送指令将0FFH送入附加段的0180H开始的128个字节存储单元中,编写一段程序。
NL
1.进入DEBUG状态
C>DEBUG↙
—
2.用A命令编辑源程序
一A↙
××××:
0100MOVDI,0180↙
0103MOVCX,80↙
0106MOVAL,FF↙
0108REPSTOSB↙
010AHLT↙
010B↙
3.用U命令反汇编以上源程序
一UCS:
0100↙
×××F×:
0100BF8001MOVDI,0180
××××:
0103B98000MOVCX,0080
××××:
0106BOFFMOVAL,FF
××××:
0108F3REPE
××××:
0109AASTOSB
××××:
010AF4HLT
4.若源程序有错可返回第2步用A命令进行修改,再进行第3步。
若无错误,可运行程序。
5.用R命令观察程序未执行前,程序中各有关寄存器内容,并填入括号内。
一R↙
AL=()DI=()CX=()DS=()
CS=()IP=()
6.用D命令观察程序未执行前,存放结果的存储区的内容。
—DES:
0180↙
7.用T命令执行一条指令,观察DI寄存器内容的变化,并填入此值:
—T↙
DI=()IP=()CS=()
8.用T命令一条条执行程序,并观察相应寄存器内容或存储单元内容,一直执行到最后一条指令为止。
9.用D命令观察最终结果
—DES:
0180↙
此时可观察到ES:
0180~ES:
01FF单元中的内容已全部改为FF。
10.用R命令改变IP值,使它返回到程序的第一条指令处。
—RIP↙
IP××××
:
0100↙
11.用R命令以观察IP值;已改为0100
—R↙
12.用A命令对存储数据的缓冲区改变位置
—A0100↙
××××:
0100MOVDI,0200↙
××××:
0103↙
13.用D命令观察程序执行前,存储区的内容
—DES:
0200↙
14.用G命令设置断点为HLT指令处
—G010A↙
15.再用D命令观察执行结果
—DES:
0200↙
将会观察到ES:
0200~ES:
027F的内容改变为FF。
二、可执行文件的生成
1.在DOS状态下键入EDIT文件名,便进入全屏幕编辑状态。
例如:
C>EDITTEST.ASM↙
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE
START:
MOVAX,CODE
MOVDS,AX
MOVDX,OFFSETAA
MOVAH,09
INT21H
MOVAH,4CH
INT21H
AA:
DB′HOWAREYOU$′
CODEENDS
ENDSTART
2.汇编源程序
用汇编程序对源程序进行汇编生成机器能够识别的机器语言,即生成了目标文件(*.obj)。
汇编的结果给出了程序的错误语句,可以根据错误提示修改源程序。
其操作步骤如下:
C>MASM↙
Microsoft(R)MacroAssemblerVersion5.0
Copyright(c)MicrosoftCorp1981—1985,1987
ALLrightsreserved
Sourcefilename[.ASM]test↙
Objectfilename[test.obj]:
↙
SourceListing[NUL.LST]:
↙
Cross—reference[NUL.CRF]:
↙
51736+405848bytesSymbolSpacefree
0warningerrors
0severeerrors
汇编的对象是用户编写的汇编语言源程序,它必须是以ASM为扩展名。
汇编程序的输出文件有三个,第一个目标文件,它以OBJ为扩展名,产生OBJ文件是我们进行汇编操作的主要目的;第二个是列表文件,它以LST为扩展名,列表文件同时给出源程序和机器语言程序,从而可以使调试变得方便,列表文件是可有可无的,如不要,直接键入回车键即可,如需要,则打入文件名和回车;第三是交叉符号表,此表给出了用户定义的所有符号,对每个符号都列出了将其定义的所在行号和引用的符号,并在定义行号上加“#”号,同列表文件一样,交叉符号表为调试工作带来很大的方便。
交叉符号表也是可有可无的,如不需要,那么在屏幕上出现提示信息[NUL.CRF]:
时,打入回车即可。
汇编过程结束时,会给出源程序中的警告性错误[warningErrors]和严重错误[severeErrors],前者指一般性错误,后者指语法性错误,当存在这两类错误时,屏幕上除指出错误个数表外,还给出错误信息代号和错误所在的行号。
如果汇编过程中有错误,则程序员应该重新用编辑命令进行修改,再进行汇编,最终直到汇编正确通过。
要指出的是汇编过程只能指出源程序中的语法错误,并不能指出算法错误和其它错误。
3.用Link命令产生可执行文件(*.EXE文件)
汇编过程根据源程序产生二进制的目标文件(OBJ文件),但OBJ文件用的是浮动地址,它不能直接上机执行。
所以还必须使用链接程序(LINK)将OBJ文件转换成可执行的EXE文件。
Link命令还可以将一个目标文件和其它多个模块(这些模块是由用户编写的,也可以是某个程序库中存在的)链接起来。
具体操作如下:
C>LinkTEST↙
此时屏幕上见到如下回答信息:
IBMPersonalcomputerLinker
Version2.00(C)copyrightIBMCorpl981,1982,1983
RUNFile[test.EXE]:
↙
ListFile[NUL.MAP]:
test↙
Libraries[.LiB]:
↙
Waming:
1NOStacksegment
therewas1errordetected
Link命令有一个输入文件,即OBJ文件,有时,用户程序用到库函数,此时,对于提示信息Libraries[.LiB]要输入库名。
Link过程产生两个输出文件,一个是扩展名为EXE的执行文件,产生此文件是Link过程的主要目的,另一个是扩展名MAP的列表分配文件,有人也称它为映像文件,它给出每个段在内存中的分配情况MAP文件也是可有可无的。
4.程序执行
C>test↙
如果运行结果不正确可把test.exe文件装入debug进行调试,发现错误并改正。
C>debugtest.exe↙
—U↙
三、实验设备
硬件环境IBM/PC及其兼容机
软件环境操作系统DOS2.0版本以上
调试程序DEBUG.COM编辑程序EDIT.EXE
汇编程序MASM.EXE连接程序LINK.EXE
四、实验内容
(1)
1.将数据段中0200H字节存储单元中的二位BCD码转换为二个ASCII码送0201H开始的二个字节单元中,编写一段程序。
2.编写一段程序,在内存中自0200H地址开始的连续七个单元中存入0~9的平方值。
要求利用计算法查表求0210H单元中指定数0~9中的任意一数的平方值,并将所求平方值存入0211H单元中。
五、实验内容
(2)
1.显示一个字符‘A’
2.从键盘上读取一个字符并显示
3.间隔0.5秒显示8个A
实验二两个多位十进制数相加的实验
一、实验目的
1.学习数据传送和算术运算指令的用法。
2.熟悉在PC机上建立、汇编、连接、调试和运行8088/8086汇编语言程序的过程。
二、实验内容
将两个多位十进制数相加。
要求被加数均以ASCII码形式各自顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回DATAl处。
三、程序框图
四、程序清单
CRLFMACRO;建立宏指令CRLF
MOVDL,0DH
MOVAH,02H
INT21H
MOVDL,0AH
MOVAH,02H
INT21H
ENDM
DATASEGMENT
DATA1DB33H,39H,31H,37H,34H;第一个数据(作为被加数)
DATA2DB36H,35H,30H,38H,32H;第二个数据(作为加数)
DATAENDS
STACKSEGMENT;堆栈段
STADB20DUP(?
)
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,TOP
MOVSP,AX
MOVSI,OFFSETDATA2
MOVBX,05
CALLDISPL;显示被加数
CRLF
MOVSI,OFFSETDATAl
MOVBX,05;显示加数
CALLDISPL
CRLF
MOVDI,OFFSETDATA2
CALLADDA;加法运算
MOVSI,OFFSETDATAl
MOVBX,05;显示结果
CALLDISPL
CRLF
MOV AX,4C00H
INT21H
DISPLPROCNEAR;显示子功能
DS1:
MOVAH,02
MOVDL,[SI+BX-1];显示字符串中一字符
INT21H
DECBX;修改编移量
JNZDSl
RET
DISPLENDP
ADDAPROCNEAR
MOVDX,SI
MOVBP,DI
MOVBX,05
AD1:
SUBBYTEPTR[SI+BX-1],30H
SUBBYTEPTR[DI+BX-1],30H
DECBX;将ASCII码表示的数字串转化
为十六进制的数字串
JNZADl
MOVSI,DX
MOVDI,BP
MOVCX,05;包括进位,共5位
CLC
AD2:
MOVAL,[SI]
MOVBL,[DI]
ADCAL,BL;带进位相加
AAA;非组合BCD码的加法调整
MOV[SI],AL;结果送被加数区
INCSI
INCDI;指向下一位
LOOPAD2;循环
MOVSI,DX
MOVDI,BP
MOVBX,05
AD3:
ADDBYTEPTR[SI+BX-1],30H
ADDBYTEPTR[DI+BX-1],30H
DECBX;十六进制的数字串转化为ASCII码表示的数字串
JNZAD3
RET
ADDAENDP
CODEENDS
ENDSTART
五、思考题
自编两个多位十进制数相减程序。
实验三十进制数乘除运算编程
(1) 两个数相乘的实验
一、实验目的
掌握乘法指令和循环指令的用法
二、实验内容
实现十进制数的乘法。
被乘数和乘数均以ASCII码形式存放在内存中,乘积在屏幕上显示出来。
三、程序框图
四、程序清单
DATASEGMENT
DATAlDB32H,39H,30H,35H,34H
DATA2DB33H
RESULTDB6DUP(00H)
DATAENDS
STACKSEGMENT
STADB20DUP(?
)
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,TOP
MOVSP,AX
MOVSI,OFFSETDATA2
MOVBL,[SI];乘数2BL
ANDBL,00001111B;屏蔽高4位,ASCII码转化为十六进制数
MOVSI,OFFSETDATAl
MOVDI,OFFSETRESULT
MOVCX,05
LOOPl:
MOVAL,[SI]
ANDAL,00001111B;取被乘数1,ASCII变十六进制数
INCSI;指向被乘数1的下一字符单元
MULBL;相乘
AAM;AAM调整
ADDAL,[DI];结果低位与前次计算的进位相加
AAA;AAA调整
MOV[DI],AL
INCDI;结果送存到下一单元
MOV[DI],AH
LOOPLOOP1;计算机结果高位进位送存
MOVCX,06
MOVSI,OFFSETRESULT
DISPL:
MOVAH,02
MOVDL,[SI]
ADDDL,30H
INT21H
DECSI
LOOPDISPL;显示结果
MOVAX,4C00H
INT21H;结束
CODEENDS
ENDSTART
(2) BCD码相乘的程序
一、实验目的
掌握用组合的BCD码表示数据,并熟悉怎样实现组合BCD码乘法运算
二、实验内容
实现BCD码的乘法,要求被乘数和乘数以组合的BCD码形式存放,各占一个内存单元。
乘积存放在另外两个内存单元中。
由于没有组合的BCD码乘法指令,程序中采用将乘数1作为计数器,累加另一个乘数的方法得到计算结果。
三、程序框图
四、程序清单
DISPLMACRO
ADDDL,30H
MOVAH,02
INT21H
ENDM
CRLFMACRO
MOVDL,0DH
MOVAH,02
INT21H
MOVDL,0AH
MOVAH,02
INT21H
ENDM
DATASEGMENT
DATAlDB01001000B;48H
DATA2DB01110101B;75H
RESULTDW?
DATAENDS
STACKSEGMENT
STADB20DUP(?
)
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,TOP
MOVSP,AX
MOVDI,OFFSETRESULT;指向结果存储区
MOVSI,OFFSETDATAl;指向乘数1
MOVAH,[SI]
MOVCL,04
SHRAH,CL;显示乘数1高位字节
MOVDL,AH
DISPL
MOVAL,[SI]
MOVBL,AL;显示乘数1低位字节
ANDAL,00001111B
MOVDL,AL
DISPL
CRLF;回车换行
MOVSI,OFFSETDATA2;指向乘数2
MOVAH,[SI]
MOVCL,04
SHRAH,CL;显示乘数2高位字节
MOVDL,AH
DISPL
MOVAL,[SI]
ANDAL,00001111B
MOVDL,AL;显示乘数2低位字节
DISPL
CRLF;回车换行
XORDX,DX;DX(部分积)清0
S1:
CMPBL,0
JZS2;乘数1的值已减为O否?
CLC
MOVAL,[SI]
ADCAL,DL;乘数2加部分积低位
DAA;组合的BCD码调整
MOVDL,AL;结果送部分积高位
MOVAL,00H
ADCAL,DH;往部分高位送进位
DAA;组合BCD码调整
MOVDH,AL;结果送部分积高位
MOVAL,BL
DECAL;乘数1的值减1
DAS;组合BCD码减法调整
MOVBL,AL;结果送BL
JMPS1
S2:
MOV[RESULT],DX;结果送存储器
MOVSI,DX
MOVCL,4
SHRDH,CL
MOVDL,DH
DISPL
MOVDX,SI;显示结果高2位
ANDDH,00001111B
MOVDL,DH
DISPL
MOVDX,SI
MOVCL,4
SHRDL,CL
DISPL
MOVDX,SI;显示结果低2位
ANDDL,00001111B
DISPL
CRLF;回车换行
S3:
MOVAX,4C00H
INT21H;返回DOS
CODEENDS
ENDSTART
实验四 排序实验
一、实验目的
掌握用汇编语言编写的程序的思路和方法。
二、实验内容
从首地址为1000H开始存放50个数,要求设计程序将这些数由小到大排序,排序后的数,仍放在该区域中。
三、程序框图
四、程序清单
CRLFMACRO
MOVAH,02H
MOVDL,0DH
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
ENDM
DATASEGMENT
SORTNUMEQU9
MESSlDB′INPUTSEGMENTVALUE:
$′
MESS2DB′INPUTOFFSETVALUE:
$′
MESS3DB′SORTOK!
′0DH,0AH′,$′
DRRORDB′INPUTERROR!
′,0DH,0AH′,$′
DATAENDS
STACKSEGMENT
STADW32DUP(?
)
TOPDW?
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,DATA