微机原理实验报告.docx
- 文档编号:6920138
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:27
- 大小:379.08KB
微机原理实验报告.docx
《微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
微机原理实验报告
微机原理与应用课程实验报告
实验分工:
报告人
同组人
实验时间:
2014.12.10
课程设计
一、题目要求
(1)在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据;
(2)将上述源区内容传送到目的内存区2(首址为1100H)中;
(3)检验上述传送过程是否正确,如有错误,在紧跟内存区2后的第一个字节开始写入ASCII码“ERROR”,否则写入“OK”。
(4)用冒泡法将上述内存区2的数据,按从小到大的次序重新排列,排列后存放在内存区3(开始地址为2100H)。
(5)将上述内存区2和内存区3的第100个数据分别乘以2,并转为BCD码,保存在各自存储区的末尾。
再将上述两个BCD码相乘,其结果保存在内存区1的末尾处。
二、实验程序框图
三、程序代码
codesegment
assumecs:
code
DATA1db16dup(?
)
DATA2db'ERROR'
DATA3db'OK'
;在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据
start:
movax,0100h;规定目标程序存放单元的偏移量
movds,ax;数据段地址
moves,ax
movsi,offsetDATA1;偏移地址
movcx,0010H;循环次数
movbx,0100H
moval,ofH
S1:
movcs:
[si],al
mov[bx],cs:
[si]
incsi
incbx
decal
loopS1
nop
;将内存区1数据搬移到内存区2中
movcx,16
movsi,0100h
movbx,1100h
S2:
moval,[si]
mov[bx],al
incsi
incbx
loopS2
nop
;对比内存区1的数据与内存区2的数据是否相同
movcx,16
movsi,0100h
movbx,1100h
comp:
movax,[si]
movdx,[bx]
cmpax,dx
jneerro
incsi
incbx
loopcomp
;数据如果都相同,说明上述传输过程正确
movsi,offsetDATA3
movdi,1110h
movbl,0
movcx,2
enterOK:
movbl,cs:
[si]
mov[di],bl
incsi
incdi
loopenterOK
nop
jmpS3
;如果有一个数据不相同,说明上述传输过程不正确
err:
movsi,offsetDATA2
movdi,1110h
movbl,0
movcx,5
enterERR:
movbl,cs:
[si]
mov[di],bl
incsi
incdi
loopenterERR
;将内存区2数据搬移到内存区3中
S3:
movsi,1100h
movcx,0010h
movbx,2100h
moval,0
movcx,16
fil:
moval,[si]
mov[bx],al
incsi
incbx
loopfil
nop
;用冒泡法将内存区3的数据按从小到大重新排列
S4:
movbl,0
movcx,16
movsi,2110h
decsi
deccx
again:
moval,[si]
cmpal,[si-1]
jaenext
xchgal,[si-1]
mov[si],al
movbl,1
next:
decsi
loopagain
cmpbl,0
jnestart1
nop
movsi,1109h
moval,[si]
movcl,2
mulcl;结果在al中
movdx,0
movbx,10
divbx
shlal,4
addal,dl;把二进制数转换成BCD码
mov[1112h],al
movsi,2109h
moval,[si]
movcl,2
mulcl;结果在al中
movdx,0
movbx,10
divbx
shlal,4
addal,dl;把二进制数转换成BCD码
mov[2110h],al
;两个BCD码相乘,其结果保存在内存区1的末尾处。
movsi,1112h
movah,[si]
movcl,4
shrah,cl
moval,ah
movdl,10
muldl;结果在al中
movdl,[si]
anddl,0fh
addal,dl
movbl,al;result
movsi,2110h
movah,[si]
movcl,4
shrah,cl
moval,ah
movdl,10
muldl
movdl,[si]
anddl,0fh
addal,dl;结果在al中
mulbl
mov[0110h],al
codeends
endstart
四、实验结果
(1)在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据;
(2)将上述源区内容传送到目的内存区2(首址为1100H)中;
(3)检验上述传送过程是否正确,如有错误,在紧跟内存区2后的第一个字节开始写入ASCII码“ERROR”,否则写入“OK”。
(4)用冒泡法将上述内存区2的数据,按从小到大的次序重新排列,排列后存放在内存区3(开始地址为2100H)。
(5)将上述内存区2和内存区3的第100个数据分别乘以2,并转为BCD码,保存在各自存储区的末尾。
再将上述两个BCD码相乘,其结果保存在内存区1的末尾处。
内存区2
内存区3
内存区1末尾处
五、分析与总结
本课程设计是对微机原理实验的综合运用,涉及做过的每个子实验且在此基础上有所改进,并活用了学过的微机原理知识,充分考察了对于程序语言的阅读和编写能力。
在这个设计实验中因为程序较长,出现错误比较难以改正,又由于自己完成实验时运用的软件不同,导致在寻找程序内存区时有一定困难,但这些问题在土同学们讨论和老师的指导下都得以解决。
本次课程设计及实验内容让我受益匪浅且巩固了微机原理的基础知识。
实验一、汇编语言程序基本操作
一、实验目的
1.熟悉EL微机实验系统的操作。
2.掌握汇编语言设计和调试方法。
二、实验内容
1.把2000H-20FFH的内容清零。
2.把源RAM区(首址为2200H)内100H个字节的数据,传送到目的RAM区(首址为2000H)。
三、实验程序框图
1.清零程序框图2.数据传送程序框图
四、实验步骤
1.EL微机实验系统与PC机联机
(1)打开EL微机实验系统电源,初始化后,数码管显示“P_”,表示实验系统处于下位键盘监控状态。
(2)在PC机处于在Windows软件平台下,单击EL86图标,根据屏幕提示进行联机操作,实验系统数码管显示“C_”,表示实验系统处于上位PC机监控状态。
2.编辑程序
选择“打开”菜单,打开现有的程序(清零实验程序名:
RAM0.ASM)或者选择“新建”菜单,编辑新程序。
(编辑新程序注意:
在org100h的下一行,必须写标号start.)
3.编译程序
编译并连接程序,信息窗口显示“程序下传正确”,表示编译、连接成功。
如果显示“程序下传不正确”,则应选择“运行”菜单中“系统复位”操作,然后重新进行编译、连接。
4.运行程序
在“运行”菜单中可选择多种手段进行调试运行。
建议设立断点后再运行程序。
5.检查运行结果
在内存窗口检查运行结果。
修改内存地址时,将光标移动到内存显示区的头部,右击鼠标,在弹出菜单选择修改内存地址,即弹出地址输入窗口,输入相应的地址即可。
五、程序代码
1.2000H-20FFH清零程序
CODESEGMENT
ASSUMECS:
CODE
ORG0100H
START:
MOVAX,0100H
MOVDS,AX;段基址
MOVES,AX
MOVSI,1000H;偏移地址
MOVCX,0100H;设置循环次数
ANDAL,0
QINGLING:
MOV[SI],AL
INCSI
DECCX
JNZQINGLING;置完100H个数后循环终止
NOP;设置断点处
JMPSTART
CODEENDS
ENDSTART
2.数据传送程序
CODESEGMENT
ASSUMECS:
CODE
ORG0100H
START:
MOVAX,0100H
MOVDS,AX;段基址
MOVES,AX
MOVDI,1000H;目的数据区偏移地址
MOVSI,1200H;源数据区偏移地址
MOVCX,0100H;设置循环次数
S1:
MOV[SI],10H;将源RAM区数据置10H
INCSI
LOOPS1
MOVSI,1200H
MOVCX,0100H
S2:
MOVAL,[SI];将源数据通过AL传送到目的数据区
MOV[DI],AL
INCSI
INCDI
DECCX
JNZS2
NOP;设置断点处
CODEENDS
ENDSTART
六、程序调试过程
1.清零
2.数据传送
将1200H作为源数据区,其中数据置为10H,并通过AL传送到目的数据区1000H。
七、分析与总结
通过“汇编语言程序基本操作”作为第一个实验,让我们熟悉了emu8086软件,也熟悉了微机原理课程中学习到的编程语言,并学会阅读、修改甚至编写程序。
清零和数据传输程序作为最基础也是最重要的两类程序,虽然刚上手做的比较费力,但也为下面的实验内容打下了基础。
实验二排序实验
一、实验目的
掌握多重循环设计及调试方法。
二、实验内容
编写并调试一个排序子程序,其功能为用冒泡法将16个无符号的正整数,按从小到大的次序重新排列。
三、实验程序框图
四、实验步骤
1.在RAM区2000H-201FH中放入不等的数据。
2.编辑程序。
3.编译、连接程序。
4.在程序中检查交换标志语句前设立断点后再运行程序。
5.在内存窗口检查运行结果,并记录。
地址
初始
状态
第一遍扫描
第二遍扫描
第三遍扫描
第四遍扫描
第五遍扫描
第六遍扫描
第七遍扫描
第八遍扫描
第九遍扫描
第十遍扫描
第十一遍扫描
2000
12
11
11
11
11
11
11
11
11
11
11
11
2002
15
12
12
12
12
12
12
12
12
12
12
12
2004
46
15
15
15
15
15
15
15
15
15
15
15
2006
38
46
19
19
19
19
19
19
19
19
19
19
2008
89
38
46
22
22
22
22
22
22
22
22
22
200A
43
89
38
46
27
27
27
27
27
27
27
27
200C
27
43
89
38
46
33
33
33
33
33
33
33
200E
65
27
43
89
38
46
38
38
38
38
38
38
2010
19
65
27
43
89
38
46
43
43
43
43
43
2012
76
19
65
27
43
89
43
46
46
46
46
46
2014
55
76
76
65
65
43
89
55
55
55
55
55
2016
33
55
55
76
76
65
55
89
61
61
61
61
2018
61
33
33
55
55
76
61
61
89
65
65
65
201A
11
61
61
33
33
55
65
65
65
89
72
72
201C
22
22
22
61
61
61
72
72
72
72
89
76
201E
72
72
72
72
72
72
76
76
76
76
76
89
五、程序代码
冒泡法程序,适应于字节型数
;bubblesort
codesegment
assumecs:
code
org0100h
start:
jmpstart1
buffdb
12h,15h,46h,38h,89h,43h,27h,65h,19h,76h,55h,33h,61h,11h,22h,72h;0x1103
contequ$-buff;设置循环长度
start1:
movbl,0
movcx,cont;count
movsi,cx
decsi
deccx
again:
moval,buff[si]
cmpal,buff[si-1]
jaenext;若前一个数大于后一个数,交换两数据位置
xchgal,buff[si-1]
movbuff[si],al
movbl,1
next:
decsi;地址向后移动一个字节
loopagain
cmpbl,0;当数据不再变动,即BL=0,循环结束
jnestart1
nop
codeends
endstart
六、程序调试过程
程序调试中发现的问题:
1、该程序循环次数较多,对分析程序功能产生困难
2、适用于单字节型的冒泡法程序中唯有第六、第七遍扫描中出现了没有把最小数前置的错误问题,但在下一次扫描中更正了结果,因此并没有影响最终结果。
3、字符型冒泡法程序改进
实现在RAM区2000H一201FH中放入数据并将其按从小到大排序的程序为:
CODESEGMENT
ASSUMECS:
CODE
ORG0100H
START:
MOVAX,0100H
MOVDS,AX;数据段地址
MOVES,AX
MOVSI,1000H
MOV[SI],45H;向RAM区2000H一
ADDSI,2;201FH中放人不等
MOV[SI],18H;的数据
ADDSI,2
MOV[SI],25H
ADDSI,2
MOV[SI],42H
ADDSI,2
MOV[SI],06H
ADDSI,2
MOV[SI],16H
ADDSI,2
MOV[SI],15H
ADDSI,2
MOV[SI],27H
ADDSI,2
MOV[SI],13H
ADDSI,2
MOV[SI],22H
ADDSI,2
MOV[SI],13H
ADDSI,2
MOV[SI],29H
ADDSI,2
MOV[SI],78H
ADDSI,2
MOV[SI],17H
ADDSI,2
MOV[SI],33H
ADDSI,2
MOV[SI],40H
START1:
MOVSI,101FH;最后一个数据的偏移地址送到SI
SUBBL,BL;BL设为循环结束标志
MOVCX,10H;设置循环次数
AGAIN1:
MOVAX,[SI]
CMPAX,[SI-2]
JNBAGAIN2;若前一个数大于后一个数,交换两数据位置
MOVDX,AX
MOVAX,[SI-2]
MOV[SI],DX
INCBL
AGAIN2:
DECSI;地址向后移动两个字节
DECSI
DECCX
JNZAGAIN1
CMPBL,0;当数据不再变动,即BL=0,循环结束
NOP
JNESTART1
CODEENDS
ENDSTART
七、分析与总结
冒泡法排序是以前编程语言学习中学到的方法,在此应用在了微机原理实验中。
冒泡法虽然容易编出代码,但编程运行时间长,分步观察不容易。
在做16个单字节无符号数的排序时程序正确,但在做16个字符型无符号数排序时结果出错。
分析后认为问题在于16个单字节无符号数的排序时,只执行一次DECSI,偏移量减1,而做16个字型无符号数排序时要连续两次执行DECSI,使偏移量减2。
根据此分析结果修改程序后,运行成功。
实验三8253定时器/计数器
一、实验目的
掌握8253定时器/计数器的工作方式和编程原理。
二、实验内容
将定时器0、定时器1、定时器2设为模式3(方波),T0、T1的时钟由CLK3提供,其频率为750KHz。
若T0的初值设为927CH(37500十进制),则OUT0输出的方波周期为0.05S(37500*4/3*10-6)。
T2采用OUT0为时钟,若T2的初值设为00C8H(200十进制),则OUT2输出的方波周期为10S。
三、实验程序框图
四、实验步骤
1.用插针把CS8253插孔与CS0插孔相连。
2.用插针把8253CLK0、8253CLK1插孔与分频输出端CLK3插孔相连。
3.用插针把8253CLK2插孔与OUT0插孔相连。
4.用插针把8253OUT2插孔与LED1插孔相连。
5.编写调试程序。
6.运行程序。
五、程序代码
8253定时器/计数器
assumecs:
code
codesegmentpublic
org100h
start:
movdx,04a6h;控制寄存器
movax,36h;00110110b,计数器0,方式3
outdx,ax;写控制字
movdx,04a0h;T0
movax,7Ch;先写低地址
outdx,ax
movax,92h;后写高地址
outdx,ax;计数值927Ch
movdx,04a6h;控制寄存器
movax,76h;00110110b,计数器1,方式3
outdx,ax
movdx,04a2h;T1
movax,32h
outdx,ax
movax,0;计数值32h
outdx,ax;频率为750KHZ/50=15KHZ
movdx,04a6h
movax,0b6h;00110110b,计数器2,方式3
outdx,ax
movdx,04a4h;T2
movax,0c8h
outdx,ax
movax,0;计数值0c8h
outdx,ax;频率为20HZ/200=0.1HZ
next:
nop
jmpnext
codeends
endstart
六、实验结果
示波器输入通道1与OUT0插孔相连时,可以看到周期为0.05S的方波;
与OUT1插孔相连时,可以看到周期为0.067mS的方波;
与OUT2插孔相连时,可以看到周期为10S的方波;示波器屏幕可看到一个绿点缓慢的周期性移动,移动路线形状为周期为10S的方波。
七、分析与总结
通过该实验,我熟悉了8252芯片和微机接口原理的方法,掌握了8253定时器/计数器的基本工作原理、工作方式和编程原理,并熟悉了相关汇编代码的编写。
本次试验中还使用了试验箱,连接电路,利用代码控制实验电路,不但加深了对课本理论知识的理解,也学会了软硬件结合的方法调试程序。
本次实验中我还尝试使用INT21H中断0A号功能,将输入一串字符到存储器中转化为十六进制数作为分频数的方法产生一个负脉冲宽度的周期方波。
实验四BCD码相乘
一、实验目的
掌握用组合BCD码表示数据以及组合BCD码相乘的方法
二、实验内容
编写两个单字节组合BCD码的乘法程序。
三、实验程序框图
四、实验步骤
1.编写调试程序。
2.设立断点后再运行程序。
五、程序代码
两个压缩BCD码相乘,结果为5个字节
CODESEGMENT
ASSUMECS:
CODE
org0100h
start:
jmpstart1
pbcddb66h,88h;压缩BCD码:
0x7102,0x7103
resultdb5dup(?
);结果:
0x7104-0x7108
start1:
movsi,offsetpbcd
movah,[si]
movcl,4
shrah,cl
moval,ah
movdl,10
muldl;结果在al中
movdl,[si]
anddl,0fh
addal,dl
movbl,al;result
incsi
movah,[si]
movcl,4
shrah,cl
moval,ah
movdl,10
muldl;结果在al中
movdl,[si]
anddl,0fh
addal,dl
mulbl
movdx,0
movbx,10000
divbx
mov[result],al
movax,dx
movdx,0
movbx,1000
divbx
mov[result+1],al
movax,dx
movdx,0
movbx,100
divbx
mov[result+2],al
movax,dx
movdx,0
movbx,10
divbx
mov[result+3],al
mov[result+4],dl
nop
codeends
endstart
六、实验结果
运行程序后,可以看到结果数据区0x7104-0x7108依次存放着0,5,8,0,8;因此两压缩BCD码的乘积为5808
七、分析与总结
通过此次BCD码相乘的编程设计实验,我更加牢固的掌握了对BCD码数据的处理,更熟悉了二、十、十六进制数间的转换,通过这个实验也对其他指令的运用有了进一步比较深刻的了解以及对乘
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 实验 报告