微机原理与应用课程实验报告
实验分工:
报告人
同组人
实验时间: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的末尾处。
二、实验程序框图
三、程序代码
code segment
assume cs:code
DATA1 db 16 dup(?)
DATA2 db 'ERROR'
DATA3 db 'OK'
;在数据段首址为0100H开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据
start:
mov ax,0100h ;规定目标程序存放单元的偏移量
mov ds,ax ;数据段地址
mov es,ax
mov si,offset DATA1 ;偏移地址
mov cx,0010H ;循环次数
mov bx,0100H
mov al, ofH
S1:
mov cs:[si],al
mov [bx],cs:[si]
inc si
inc bx
dec al
loop S1
nop
;将内存区1数据搬移到内存区2中
mov cx,16
mov si,0100h
mov bx,1100h
S2:
mov al,[si]
mov [bx],al
inc si
inc bx
loop S2
nop
;对比内存区1的数据与内存区2的数据是否相同
mov cx,16
mov si,0100h
mov bx,1100h
comp:
mov ax,[si]
mov dx,[bx]
cmp ax,dx
jne erro
inc si
inc bx
loop comp
;数据如果都相同,说明上述传输过程正确
mov si,offset DATA3
mov di,1110h
mov bl,0
mov cx,2
enterOK:
mov bl,cs:[si]
mov [di],bl
inc si
inc di
loop enterOK
nop
jmp S3
;如果有一个数据不相同,说明上述传输过程不正确
err:
mov si,offset DATA2
mov di,1110h
mov bl,0
mov cx,5
enterERR:
mov bl,cs:[si]
mov [di],bl
inc si
inc di
loop enterERR
;将内存区2数据搬移到内存区3中
S3:
mov si,1100h
mov cx,0010h
mov bx,2100h
mov al,0
mov cx,16
fil:
mov al,[si]
mov [bx],al
inc si
inc bx
loop fil
nop
;用冒泡法将内存区3的数据按从小到大重新排列
S4:
mov bl,0
mov cx ,16
mov si,2110h
dec si
dec cx
again:
mov al,[si]
cmp al,[si-1]
jae next
xchg al,[si-1]
mov [si],al
mov bl,1
next:
dec si
loop again
cmp bl,0
jne start1
nop
mov si,1109h
mov al,[si]
mov cl,2
mul cl ;结果在al中
mov dx,0
mov bx,10
div bx
shl al,4
add al,dl ;把二进制数转换成BCD码
mov [1112h],al
mov si,2109h
mov al,[si]
mov cl,2
mul cl ;结果在al中
mov dx,0
mov bx,10
div bx
shl al,4
add al,dl ;把二进制数转换成BCD码
mov [2110h],al
;两个BCD码相乘,其结果保存在内存区1的末尾处。
mov si,1112h
mov ah,[si]
mov cl,4
shr ah,cl
mov al,ah
mov dl,10
mul dl ;结果在al中
mov dl,[si]
and dl,0fh
add al,dl
mov bl,al ;result
mov si,2110h
mov ah,[si]
mov cl,4
shr ah,cl
mov al,ah
mov dl,10
mul dl
mov dl,[si]
and dl,0fh
add al,dl ;结果在al中
mul bl
mov [0110h],al
code ends
end start
四、实验结果
(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.EL微机实验系统与PC机联机
(1) 打开EL微机实验系统电源,初始化后,数码管显示“P_”,表示实验系统处于下位键盘监控状态。
(2) 在PC机处于在Windows软件平台下,单击EL86图标,根据屏幕提示进行联机操作,实验系统数码管显示“C_”,表示实验系统处于上位PC机监控状态。
2. 编辑程序
选择“打开”菜单,打开现有的程序(清零实验程序名:RAM0.ASM)或者选择“新建”菜单,编辑新程序。(编辑新程序注意:在org 100h的下一行,必须写标号start.)
3.编译程序
编译并连接程序,信息窗口显示“程序下传正确”,表示编译、连接成功。如果显示“程序下传不正确”,则应选择“运行”菜单中“系统复位”操作,然后重新进行编译、连接。
4.运行程序
在“运行”菜单中可选择多种手段进行调试运行。建议设立断点后再运行程序。
5.检查运行结果
在内存窗口检查运行结果。修改内存地址时,将光标移动到内存显示区的头部,右击鼠标,在弹出菜单选择修改内存地址,即弹出地址输入窗口,输入相应的地址即可。
五、程序代码
1. 2000H-20FFH清零程序
CODE SEGMENT
ASSUME CS:CODE
ORG 0100H
START: MOV AX,0100H
MOV DS,AX ;段基址
MOV ES,AX
MOV SI,1000H ;偏移地址
MOV CX,0100H ;设置循环次数
AND AL,0
QINGLING: MOV [SI],AL
INC SI
DEC CX
JNZ QINGLING ;置完100H个数后循环终止
NOP ;设置断点处
JMP START
CODE ENDS
END START
2.数据传送程序
CODE SEGMENT
ASSUME CS:CODE
ORG 0100H
START: MOV AX,0100H
MOV DS,AX ;段基址
MOV ES,AX
MOV DI,1000H ;目的数据区偏移地址
MOV SI,1200H ;源数据区偏移地址
MOV CX,0100H ;设置循环次数
S1: MOV [SI],10H ;将源RAM区数据置10H
INC SI
LOOP S1
MOV SI,1200H
MOV CX,0100H
S2: MOV AL,[SI] ;将源数据通过AL传送到目的数据区
MOV [DI],AL
INC SI
INC DI
DEC CX
JNZ S2
NOP ;设置断点处
CODE ENDS
END START
六、程序调试过程
1.清零
2.数据传送
将1200H作为源数据区,其中数据置为10H,并通过AL传送到目的数据区1000H。
七、分析与总结
通过“汇编语言程序基本操作”作为第一个实验,让我们熟悉了emu8086软件,也熟悉了微机原理课程中学习到的编程语言,并学会阅读、修改甚至编写程序。清零和数据传输程序作为最基础也是最重要的两类程序,虽然刚上手做的比较费力,但也为下面的实验内容打下了基础。
实验二 排序实验
一、实验目的
掌握多重循环设计及调试方法。
二、实验内容
编写并调试一个排序子程序,其功能为用冒泡法将16个无符号的正整数,按从小到大的次序重新排列。
四、实验步骤
1.在RAM区2000H-201FH中放入不等的数据。
2.编辑程序。
3.编译、连接程序。
4.在程序中检查交换标志语句前设立断点后再运行程序。
5.在内存窗口检查运行结果,并记录。
五、程序代码
冒泡法程序,适应于字节型数
;bubble sort
code segment
assume cs:code
org 0100h
start:
jmp start1
buff db
12h,15h,46h,38h,89h,43h,27h,65h,19h,76h,55h,33h,61h,11h,22h,72h ; 0x1103
cont equ $-buff ;设置循环长度
start1:
mov bl,0
mov cx ,cont ;count
mov si,cx
dec si
dec cx
again:mov al,buff[si]
cmp al,buff[si-1]
jae next ;若前一个数大于后一个数,交换两数据位置
xchg al,buff[si-1]
mov buff[si],al
mov bl,1
next: dec si ;地址向后移动一个字节
loop again
cmp bl,0 ; 当数据不再变动,即BL=0,循环结束
jne start1
nop
code ends
end start
六、程序调试过程
程序调试中发现的问题:
1、该程序循环次数较多,对分析程序功能产生困难
2、适用于单字节型的冒泡法程序中唯有第六、第七遍扫描中出现了没有把最小数前置的错误问题,但在下一次扫描中更正了结果,因此并没有影响最终结果。
3、字符型冒泡法程序改进
实现在RAM区2000H一201FH中放入数据并将其按从小到大排序的程序为:
CODE SEGMENT
ASSUME CS:CODE
ORG 0100H
START: MOV AX,0100H
MOV DS,AX ;数据段地址
MOV ES,AX
MOV SI,1000H
MOV [SI],45H;向RAM区2000H一
ADD SI,2 ;201FH中放人不等
MOV [SI],18H ;的数据
ADD SI,2
MOV [SI],25H
ADD SI,2
MOV [SI],42H
ADD SI,2
MOV [SI],06H
ADD SI,2
MOV [SI],16H
ADD SI,2
MOV [SI],15H
ADD SI,2
MOV [SI],27H
ADD SI,2
MOV [SI],13H
ADD SI,2
MOV [SI],22H
ADD SI,2
MOV [SI],13H
ADD SI,2
MOV [SI],29H
ADD SI,2
MOV [SI],78H
ADD SI,2
MOV [SI],17H
ADD SI,2
MOV [SI],33H
ADD SI,2
MOV [SI],40H
START1: MOV SI,101FH ;最后一个数据的偏移地址送到SI
SUB BL,BL ;BL设为循环结束标志
MOV CX ,10H ;设置循环次数
AGAIN1: MOV AX,[SI]
CMP AX,[SI-2]
JNB AGAIN2 ;若前一个数大于后一个数,交换两数据位置
MOV DX,AX
MOV AX,[SI-2]
MOV [SI],DX
INC BL
AGAIN2: DEC SI ;地址向后移动两个字节
DEC SI
DEC CX
JNZ AGAIN1
CMP BL,0 ;当数据不再变动,即BL=0,循环结束
NOP
JNE START1
CODE ENDS
END START
七、分析与总结
冒泡法排序是以前编程语言学习中学到的方法,在此应用在了微机原理实验中。冒泡法虽然容易编出代码,但编程运行时间长,分步观察不容易。在做16个单字节无符号数的排序时程序正确,但在做16个字符型无符号数排序时结果出错。分析后认为问题在于16个单字节无符号数的排序时,只执行一次DEC SI,偏移量减1,而做16个字型无符号数排序时要连续两次执行DEC SI,使偏移量减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.用插针把8253 OUT2插孔与LED1插孔相连。
5.编写调试程序。
6.运行程序。
五、程序代码
8253定时器/计数器
assume cs:code
code segment public
org 100h
start:
mov dx,04a6h ;控制寄存器
mov ax,36h ;0011 0110b,计数器0,方式3
out dx,ax ;写控制字
mov dx,04a0h ;T0
mov ax,7Ch ;先写低地址
out dx,ax
mov ax,92h ;后写高地址
out dx,ax ;计数值927Ch
mov dx,04a6h ;控制寄存器
mov ax,76h ;0011 0110b,计数器1,方式3
out dx,ax
mov dx,04a2h ;T1
mov ax,32h
out dx,ax
mov ax,0 ;计数值32h
out dx,ax ;频率为750KHZ/50=15KHZ
mov dx,04a6h
mov ax,0b6h ; 0011 0110b,计数器2,方式3
out dx,ax
mov dx,04a4h ;T2
mov ax,0c8h
out dx,ax
mov ax,0 ;计数值0c8h
out dx,ax ;频率为20HZ/200=0.1HZ
next:
nop
jmp next
code ends
end start
六、实验结果
示波器输入通道1与OUT0插孔相连时,可以看到周期为0.05S的方波;
与OUT1插孔相连时,可以看到周期为0.067mS的方波;
与OUT2插孔相连时,可以看到周期为10S的方波;示波器屏幕可看到一个绿点缓慢的周期性移动,移动路线形状为周期为10S的方波。
七、分析与总结
通过该实验,我熟悉了8252芯片和微机接口原理的方法,掌握了8253定时器/计数器的基本工作原理、工作方式和编程原理,并熟悉了相关汇编代码的编写。本次试验中还使用了试验箱,连接电路,利用代码控制实验电路,不但加深了对课本理论知识的理解,也学会了软硬件结合的方法调试程序。
本次实验中我还尝试使用INT 21H中断0A号功能,将输入一串字符到存储器中转化为十六进制数作为分频数的方法产生一个负脉冲宽度的周期方波。
实验四 BCD码相乘
一、实验目的
掌握用组合BCD码表示数据以及组合BCD码相乘的方法
二、实验内容
编写两个单字节组合BCD码的乘法程序。
三、实验程序框图
四、实验步骤
1.编写调试程序。
2.设立断点后再运行程序。
五、程序代码
两个压缩BCD码相乘,结果为5个字节
CODE SEGMENT
ASSUME CS:CODE
org 0100h
start:jmp start1
pbcd db 66h,88h ;压缩BCD码:0x7102,0x7103
result db 5 dup(?) ;结果:0x7104-0x7108
start1:
mov si,offset pbcd
mov ah,[si]
mov cl,4
shr ah,cl
mov al,ah
mov dl,10
mul dl ;结果在al中
mov dl,[si]
and dl,0fh
add al,dl
mov bl,al ;result
inc si
mov ah,[si]
mov cl,4
shr ah,cl
mov al,ah
mov dl,10
mul dl ;结果在al中
mov dl,[si]
and dl,0fh
add al,dl
mul bl
mov dx,0
mov bx,10000
div bx
mov [result],al
mov ax,dx
mov dx,0
mov bx,1000
div bx
mov [result+1],al
mov ax,dx
mov dx,0
mov bx,100
div bx
mov [result+2],al
mov ax,dx
mov dx,0
mov bx,10
div bx
mov [result+3],al
mov [result+4],dl
nop
code ends
end start
六、实验结果
运行程序后,可以看到结果数据区0x7104-0x7108依次存放着0,5,8,0,8;因此两压缩BCD码的乘积为5808
七、分析与总结
通过此次BCD码相乘的编程设计实验,我更加牢固的掌握了对BCD码数据的处理,更熟悉了二、十、十六进制数间的转换,通过这个实验也对其他指令的运用有了进一步比较深刻的了解以及对乘法运算程序的子模块的认识。
虽然有学习过C++但,本次微机原理实验还是比较困难,特别是设计题目部分,因此通过实验我认为我还要在微机课程上多花功夫和时间,才能更牢固的掌握这门课程所学到的知识。在此感谢老师在实验过程中对我的细心指导。
微机原理与接口技术实验指导书班级学号099074姓名安徽工业大学计算机学院实验一存贮器读写实验一实验内容对指定地址区间的RAM40…
实验题目8253定时计数器实验一实验目的与要求1学会8253芯片和微机接口原理和方法2掌握8253定时器计数器的工作方式和编程原理…
微机原理实验报告实验一两个多位十进制数相加的实验一实验目的学习数据传送和算术运算指令的用法熟悉在PC机上建立汇编链接调试和运行汇编…
微机原理及接口技术实验报告20xx20xx学年第一学期班级姓名学号指导教师实验一Emu8086软件的使用一实验目的1熟悉汇编语言开…
大连理工大学本科实验报告课程名称计算机原理课程设计学院系电气工程学院专业电气工程及其自动化班级学号学生姓名20xx年12月30日大…
21显示程序实验1实验目的1掌握在PC机上以十六进制形式显示数据的方法2掌握部分DOS功能调用使用方法3熟悉Windows集成操作…
实验题目8253定时计数器实验一实验目的与要求1学会8253芯片和微机接口原理和方法2掌握8253定时器计数器的工作方式和编程原理…
姓名:XXX学号:XXXXXX指导教师:XXX实验一Debug命令及汇编指令和寻址的应用一、实验内容1、设堆栈段指针SP=1000…
计算机学院微机接口实验报告专业计算机科学与技术班级姓名学号实验一汇编语言程序设计实验一实验目的熟悉汇编语言程序设计及TDPITE8…
洛阳理工学院实验报告12345洛阳理工学院实验报告678洛阳理工学院实验报告9101112洛阳理工学院实验报告1314洛阳理工学院…
实验一Debug命令及汇编指令和寻址的应用一、实验目的:1、掌握DEBUG的基本命令及其功能,学会用DEBUG调试程序;2、掌握8…