微机原理实验报告.docx
《微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告.docx(41页珍藏版)》请在冰豆网上搜索。
![微机原理实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/2/75e1c9fc-4bd4-4cc4-a72d-59d5dcf22524/75e1c9fc-4bd4-4cc4-a72d-59d5dcf225241.gif)
微机原理实验报告
西安交通大学实验报告
成绩
课程_微机与接口技术第页共页
系别__生物医学工程_________实验日期:
年月日
专业班级_____组别_____交报告日期:
年月日
姓名__学号__报告退发(订正、重做)
同组人_教师审批签字
实验一汇编语言程序设计
一、实验目的
1、掌握Lab6000p实验教学系统基本操作;
2、掌握8088/8086汇编语言的基本语法结构;
3、熟悉8088/8086汇编语言程序设计基本方法
二、实验设备
装有emu8086软件的PC机
三、实验内容
1、有一个10字节的数组,其值分别是80H,03H,5AH,FFH,97H,64H,BBH,7FH,0FH,D8H。
编程并显示结果:
如果数组是无符号数,求出最大值,并显示;
如果数组是有符号数,求出最大值,并显示。
2、将二进制数500H转换成二-十进制(BCD)码,并显示“500H的BCD是:
”
3、将二-十进制码(BCD)7693转换成ASCII码,并显示“BCD码7693的ASCII是:
”
4、两个长度均为100的内存块,先将内存块1全部写上88H,再将内存块1的内容移至内存块2。
在移动的过程中,显示移动次数1,2,3…0AH…64H(16进制-ASCII码并显示子程序)
5、键盘输入一个小写字母(a~z),转换成大写字母
显示:
请输入一个小写字母(a~z):
转换后的大写字母是:
6、实现4字节无符号数加法程序,并显示结果,如99223344H+99223344H=xxxxxxxxH
四、实验代码及结果
1.1、实验代码:
DATASEGMENT
SZDB80H,03H,5AH,0FFH,97H,64H,0BBH,7FH,0FH,0D8H;存进数组
SHOWDB'THEMAXIS:
','$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA;把数据的基地址赋给DS
MOVDS,AX
MOVDX,OFFSETSHOW;调用DOS显示字符串
MOVAH,09H
INT21H
MOVSI,OFFSETSZ;数组的偏移地址赋给SI
MOVCX,10;存进数组的长度给CX
MOVDH,80H;将数组的第一个数写进DH
NEXT:
MOVBL,[SI];将数组的第一个数写进BL
CMPDH,BL;比较DH和BL中数的到校
JAENEXT1;如果DH中的数大于BL中,将跳转到NEXT1
MOVDH,BL;如果DH中的数小于BL中,将BL中的数赋给DH
NEXT1:
INCSI;偏移地址加1
LOOPNEXT;循环,CX自减一直到0,DH中存数组的最大值
;接下来的程序是将将最大值DH在屏幕上显示输出
MOVBX,02H
NEXT2:
MOVCL,4
ROLDH,CL;将DH循环右移四位
MOVAL,DH
ANDAL,0FH;将AL高位清零,一位一位进行ASCII码转换
CMPAL,09H;与09H比较大小
JBENEXT3;若小于,跳转至NEXT3,证明数值在0-9之间
ADDAL,07H;若大于,则证明为字母,因为字母与数字的ASCII码相差7,所以要加上7
NEXT3:
ADDAL,30H;因为转换为ASCII码要加30H
MOVDL,AL
MOVAH,2;DOS中断显示
INT21H
DECBX
JNZNEXT2
MOVDL,'H'
MOVAH,2
INT21H
CODEENDS
ENDSTART
实验结果:
1.2、实验代码
DATASEGMENT
SZDB80H,03H,5AH,0FFH,97H,64H,0BBH,7FH,0FH,0D8H;存进数组
SHOWDB'THEMAXIS:
','$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA;把数据的基地址赋给DS
MOVDS,AX
MOVDX,OFFSETSHOW;调用DOS显示字符串
MOVAH,09H
INT21H
MOVSI,OFFSETSZ;数组的偏移地址赋给SI
MOVCX,10;存进数组的长度给CX
MOVDH,80H;将数组的第一个数写进DH
NEXT:
MOVBL,[SI];将数组的第一个数写进BL
CMPDH,BL;比较DH和BL中数的到校
JGENEXT1;如果DH中的数大于BL中,将跳转到NEXT1
;此为无符号数与有符号数的唯一差别,JGE是无符号数的跳转
MOVDH,BL;如果DH中的数小于BL中,将BL中的数赋给DH
NEXT1:
INCSI;偏移地址加1
LOOPNEXT;循环,CX减1,一直到CX减为0,DH中存数组的最大值
;接下来的程序是将最大值DH在屏幕上显示输出
MOVBX,02H
NEXT2:
MOVCL,4
ROLDH,CL;将DH循环右移四位
MOVAL,DH
ANDAL,0FH;将AL高位清零,一位一位进行ASCII码转换
CMPAL,09H;与09H比较大小
JBENEXT3;若小于,跳转至NEXT3,证明数值在0-9之间
ADDAL,07H;若大于,则证明为字母,因为字母与数字的ASCII码相差7,所以要加上7
NEXT3:
ADDAL,30H;因为转换为ASCII码要加30H
MOVDL,AL
MOVAH,2;DOS中断显示
INT21H
DECBX
JNZNEXT2
MOVDL,'H'
MOVAH,2
INT21H
CODEENDS
ENDSTART
实验结果
2、实验代码
DATASEGMENT
BNUMDW0500H
DNUMDB4DUP()
MESDB'THEBCDOF'500H'IS:
','$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMES;将字符串偏移量写入DX
MOVAH,09H
INT21H
MOVAX,BNUM;将0500H存入AX中
LEABX,DNUM;取DNUM的偏移量
MOVDL,0
;计算1000的个数
COUNT1:
SUBAX,03E8H;AX-1000
JCNEXT1;不够减,即若CF=1,有借位,转NEXT1
INCDL;DL+1
JMPCOUNT1;跳转AGAIN1
NEXT1:
ADDAX,03E8H;AX+1000
MOV[BX],DL;将DL(即千位数)存入DNUM中
INCBX;BX+1
MOVDL,0;DL清零
;计算100个数
COUNT2:
SUBAX,0064H;AX-100
JCNEXT2
INCDL
JMPCOUNT2
NEXT2:
ADDAX,0064H
MOV[BX],DL;将DL(即百位数)存入DNUM中
INCBX
MOVDL,0
;计算10个数
COUNT3:
SUBAX,000AH;AX-10
JCNEXT3
INCDL
JMPCOUNT3
NEXT3:
ADDAX,000AH
MOV[BX],DL;将DL(十位数)存入DNUM中
INCBX
MOV[BX],AL;计算个位数
MOVCX,4;接下来的程序是将数值转化为ASCII并在屏幕上显示
LEASI,DNUM;取DNUM的地址偏移量
NEXT4:
MOVAL,[SI];将DNUM中所存的各个数值转换为ASCII码;
;在屏幕上输出显示
CMPAL,09H
JBENEXT5
ADDAL,07H
NEXT5:
ADDAL,30H
MOVDL,AL
MOVAH,2
INT21H
INCSI
DECCX
JNZNEXT4
CODEENDS
ENDSTART
实验结果
3、实验代码
DATASEGMENT
OUPDB'THEASCIIOF7963IS:
','$'
A1DB07H,09H,06H,03H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETOUP
MOVAH,09H
INT21H
MOVCL,4
MOVSI,0
NEXT:
MOVAL,A1[SI];将A1的第SI个数据传给AL
MOVBL,AL
ORAL,30H;加30转换为ASCII码值
SHRAL,4
ANDAL,0FH;将右移后的高位清零
ADDAL,30H;因为ASCII码与值之间相差30
MOVDL,AL
MOVAH,2;输出对应的ASCII码
INT21H
MOVAL,BL
ANDAL,0FH
ADDAL,30H
MOVDL,AL
MOVAH,02H
INT21H
MOVDL,''
MOVAH,02H
INT21H
INCSI
LOOPNEXT
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
实验结果
4、实验代码
DATASEGMENT
YIDB100DUP(88H)
ERDB100DUP(00H);定义数组
MESDB'THENUMBEROFCOUNTERIS:
','$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
START:
MOVAX,DATA
MOVDS,AX
MOVCL,100;计数器初值
MOVCH,00H;转移次数统计,初值
LEASI,YI;将内存块1的偏移量给SI
LEADI,ER;将内存块2的偏移量给DI
NEXT:
MOVAL,[SI]
MOV[DI],AL;将YI中的数据复制到ER中
INCSI
INCDI
INCCH
MOVDX,OFFSETMES;显示字符串
MOVAH,9
INT21H
CALLCOUNT;调用子程序
DECCL;计数减1
JNZNEXT;计数不为零,跳转执行
HLT
MAINENDP;主程序结束
;下面是子程序,实现屏幕显示转移次数功能
COUNTPROCNEAR;定义子程序属性
PUSHCX;CX进栈
MOVDH,CH
MOVBX,02H
NEXT2:
MOVCL,4
ROLDH,CL;将DH循环右移四位
MOVAL,DH
ANDAL,0FH;将AL高位清零
CMPAL,09H;与09H比较大小
JBENEXT3;若小于,跳转至NEXT3
ADDAL,07H
NEXT3:
ADDAL,30H;加30H
MOVDL,AL
MOVAH,2;DOS中断显示
INT21H
DECBX
JNZNEXT2
MOVDL,'H';显示H
MOVAH,2
INT21H
MOVDL,0AH;回车
MOVAH,2
INT21H
MOVDL,0DH;换行
MOVAH,2
INT21H
POPCX;CX出栈
RET
COUNTENDP
;子程序结束
CODEENDS
ENDSTART
实验结果
5、实验代码
DATASEGMENT
INPDB'PLEASEINPUT(a~z):
','$';设置字符串
OUPDB'THETRANSFORMATION(A~Z)IS:
','$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETINP;显示字符串,提示输入
MOVAH,9
INT21H
MOVAH,1;DOS中断调用,从键盘中读取一个字符
INT21H
PUSHAX;AX入栈
PUSHDX
MOVDL,0DH;中断调用,回车
MOVAH,2
INT21H
MOVDL,0AH;中断调用,换行
MOVAH,2
INT21H
MOVDX,OFFSETOUP;显示字符串,输出提示
MOVAH,9
INT21H
POPDX;DX出栈
POPAX;AX出栈
SUBAL,32;AL减去32,使大写转化为小写
;大小写之间的ASCII码值相差32
MOVDL,AL;DOS中断显示结果
MOVAH,2
INT21H
MAINENDP
CODEENDS
ENDSTART
实验结果:
6、实验代码
DATASEGMENT
YIDB44H,33H,22H,99H,00H
ERDB44H,33H,22H,99H,00H;装载数据,必须有后面00H
SUMDB5DUP()
OUPDB'99223344H+99223344H=','$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETOUP;显示字符串
MOVAH,9
INT21H
LEABP,YI;在BP中装入YI的地址偏移量
LEASI,ER;在SI中装入ER的地址偏移量
LEADI,SUM;在DI中装入SUM的地址偏移量
MOVCX,05;计数初值
CLC;进位位清零
NEXT:
MOVAL,[BP];将YI中的数据赋给AL
MOVAH,[SI];将ER中的数据赋给BL
ADCAL,AH;YI和ER中的数据带进位的相加
MOV[DI],AL;将相加的结果保存在SUM中
INCSI
INCDI
INCBP
DECCX
JNZNEXT;结果不为零,跳转到NEXT
;上面的程序已经将相加的结果存在了SUM中,下面的程序是将SUM中的结果转化为ASCII显示
MOVCH,05;计数器初值
NEXT1:
MOVDH,[DI-1];将所得结果最高位赋给DH
MOVBX,02H
NEXT2:
MOVCL,4
ROLDH,CL;将DH循环右移四位
MOVAL,DH
ANDAL,0FH;将AL高位清零
CMPAL,09H;与09H比较大小
JBENEXT3;若小于,跳转至NEXT3
ADDAL,07H
NEXT3:
ADDAL,30H;加30H
MOVDL,AL
MOVAH,2;DOS中断显示
INT21H
DECBX
JNZNEXT2
DECDI
DECCH
JNZNEXT1;循环显示SUM中的值
MOVDL,'H';显示H
MOVAH,2
INT21H
MAINENDP
CODEENDS
ENDSTART
实验结果
五、分析与总结
通过实验熟练了8086的指令系统和基本的程序设计格式,实验中出现的各种
问题通过一步步的分析自行解决的过程,提高了对于各种语句、指令的运用熟练程
度
实验二8255可编程并行接口实验
一、实验目的
1、掌握8255芯片结构及工作方式;
2、熟悉8255并行口扩展的编程。
二、实验设备
1、Lab6000p实验教学系统;
2、IBM-PC机
三、系统中8255模块
Lab6000p实验箱中的8255模块连线如图所示:
AD0~AD7、A0、A1、RESET、/WR、/RD已分别连至系统总线DB0~DB7、AB0、AB1、RESET、/IOW、/IOR;8255_CS、PA口、PB口、PC口引出留给用户连接。
四、实验内容和实验步骤
1、8255基本输入输出方式――开关控制LED显示
1)实验要求
开关拨上LED亮,开关拨下LED灭。
2)电路连接
8255_CS连至地址译码/CS0,PA口连至LED电平显示模块,PB口连至开关电路。
3)程序框图
4)程序代码
modeequ082h;方式0,PA,PC输出,PB输入
PortAequ8000h;PortA
PortBequ8001h;PortB
PortCequ8002h;PortC
CAddrequ8003h;控制字地址
codesegment
assumecs:
code
Start:
moval,mode
movdx,CAddr
outdx,al;输出控制字
loop1:
movdx,PortB
inal,dx
movdx,PortA
outdx,al
jmploop1
codeends
endstart
5)实验步骤
[1]在Lab6000p实验箱上完成连接电路;
[2]开启计算机电源,开启Lab6000p实验箱电源;
[3]启动WAVE6000软件;
[4]确认WAVE6000与Lab6000p连接;
[5]输入源代码;
[6]编译源代码(F9);
[7]单步运行源代码(F8),观察每条指令执行结果;
[8]连续运行程序(Ctrl+F9),上下拨动开关观察LED显示情况。
6)问题思考
[1]若8255_CS连至地址译码/CS4,程序该如何修改。
答:
只要将8255四个端口A、B、C、控制口端口号依次更改为:
0C000H,0C001H,0C002H,0C003H
[2]若PB口连至LED电平显示模块,PA口连至开关电路,程序该如何修改。
答:
只要更改8255的方式控制字为:
10010011H;方式0PA输入PB、PC输出
2、8255选通输入方式――开关控制LED显示
1)实验要求
开关上的逻辑信号在选通信号有效时读入微处理器,并送到LED显示。
2)提示
选通信号由单脉冲产生。
3)程序代码
MODEEQU10101110B
PORTAEQU8000H
PORTBEQU8001H
PORTCEQU8002H
CADDREQU8003H
CODESEGMENT
ASSUMECS:
CODE
START:
STARTPROCNEAR
MOVDX,CADDR
MOVAL,MODE
OUTDX,AL
SCAN:
MOVDX,PORTB
INAL,DX
MOVDX,PORTA
OUTDX,AL
JMPSCAN
STARTENDP
CODEENDS
ENDSTART
实验三8253可编程定时/计数器实验
一、实验目的
1、掌握8253芯片结构及工作方式;
2、熟悉8253可编程定时/计数器的编程。
二、实验设备
1、Lab6000p实验教学系统;
2、IBM-PC机
三、系统中8253模块
Lab6000p实验箱中的8253模块连线如图所示:
AD0~AD7、A0、A1、/WR、/RD已分别连至系统总线DB0~DB7、AB0、AB1、/IOW、/IOR;三个通道的OUT、GATE、CLK以及CS引出留给用户连接。
四、实验内容和实验步骤
1、8253计数实验
1)实验要求
5个脉冲后LED0亮。
2)电路连接
3)程序代码
CONTROLequ08003h
COUNT0equ08000h
COUNT1equ08001h
COUNT2equ08002h
codesegment
assumecs:
code
startprocnear
moval,30h;通道0,方式0
movdx,CONTROL
outdx,al
moval,4;计数器初始值。
movdx,COUNT0
outdx,al;低八位
moval,0
outdx,al;高八位
jmp$
startendp
codeends
endstart
4)实验步骤
[1]在Lab6000p实验箱上完成连接电路;
[2]开启计算机电源,开启Lab6000p实验箱电源;
[3]启动WAVE6000软件;
[4]确认WAVE6000与Lab6000p连接;
[5]输入源代码;
[6]编译源代码(F9);
[7]连续运行程序(Ctrl+F9),按动单脉冲按键观察LED显示情况。
5)问题思考
[1]若CS连至地址译码/CS3,程序该如何修改。
[2]为什么定时/计数器初值赋4,5个脉冲后LED才亮。
2、8253定时实验
1)实验要求
在LED上实现1秒钟亮/1秒钟灭。
2)提示
对标准脉冲信号计数,若一个计数器位数不够2个计数器(2个通道)级连(串连)。
3)程序代码
CONTROLequ08003h
COUNT0equ08000h
COUNT1equ08001h
COUNT2equ08002h
codesegment
assumecs:
code
startprocnear
moval