微机原理实验报告.docx
《微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
![微机原理实验报告.docx](https://file1.bdocx.com/fileroot1/2022-12/7/22c14907-59fd-4ce4-8877-0df060851dbe/22c14907-59fd-4ce4-8877-0df060851dbe1.gif)
微机原理实验报告
微机原理实验报告
院别:
物理与电子工程学院
专业:
电子信息工程1011班
姓名:
刘小云
学号:
2010128134
实验一两个多位十进制数相加的实验
一、实验目的
学习数据传送和算术运算指令的用法
熟悉在PC机上建立、汇编、链接、调试和运行汇编语言程序的过程。
二、实验内容
将两个多位十进制数相加,要求被加数和加数均以ASCII码形式各自顺序存放在以DATA1、DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
三、程序框图
四、实验所用程序
DATASEGMENT
DATA1DB33H,39H,31H,37H,34H;被加数
DATA1ENDEQU$-1
DATA2DB34H,35H,30H,38H,32H;加数
DATA2ENDEQU$-1
SUMDB5DUP(?
)
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,OFFSETDATA1END
MOVDI,OFFSETDATA2END
CALLADDA
MOVAX,4C00H
INT21H
ADDAPROCNEAR
MOVDX,SI
MOVBP,DI
MOVBX,05H
AD1:
SUBBYTEPTR[SI],30H
SUBBYTEPTR[DI],30H
DECSI
DECDI
DECBX
JNZAD1
MOVSI,DX
MOVDI,BP
MOVCX,05H
CLC
AD2:
MOVAL,[SI]
MOVBL,[DI]
ADCAL,BL
AAA
MOV[SI],AL
DECSI
DECDI
LOOPAD2
MOVSI,DX
MOVDI,BP
MOVBX,05H
AD3:
ADDBYTEPTR[SI],30H
ADDBYTEPTR[DI],30H
DECSI
DECDI
DECBX
JNZAD3
RET
ADDAENDP
CODEENDS
ENDSTART
五、实验程序分析及预计结果
数据定义段省略分析
MOVSI,OFFSETDATA1END;将DATA1的偏移地址给SI,SI中存放的是0004
MOVDI,OFFSETDATA2END;将DATA2的偏移地址给DI,DI中存放的是0009
CALLADDA;调用子程序ADDA
MOVAX,4C00H
INT21H
ADDAPROCNEAR
MOVDX,SI
MOVBP,DI
MOVBX,05H
AD1:
SUBBYTEPTR[SI],30H;将SI中的数值变为十进制数
SUBBYTEPTR[DI],30H;将DI中的数值变为十进制数
DECSI;将SI中的地址前移一位改变下一个数值
DECDI;将DI中的地址前移一位改变下一个数值
DECBX;定义循环的次数
JNZAD1;在BX中的数值不等于0的情况下循环执行AD1
MOVSI,DX;重新初始化SI
MOVDI,BP;重新初始化DI
MOVCX,05H
CLC;将进位标志位清零
AD2:
MOVAL,[SI]
MOVBL,[DI]
ADCAL,BL;将AL,BL中的数据用带进位的加法相加,保存到AL中
AAA
MOV[SI],AL
DECSI
DECDI
LOOPAD2
MOVSI,DX
MOVDI,BP
MOVBX,05H
AD3:
ADDBYTEPTR[SI],30H;将十进制数转化为十六进制,并存到SI中
ADDBYTEPTR[DI],30H;将十进制数转化为十六进制,并存到DI中
DECSI
DECDI
DECBX
JNZAD3
1、在数据段,定义了一个data1,分配的地址是00~04,data1end里面的内容是04h,且不占内存,定义的data2,分配的地址是05~09,类似的,data2end里面的内容是09h
2、在循环AD1过程中,data1里面的内容从开始的33h,39h,31h,37h,34h变为3,9,1,7,4;data2里面的内容也从开始的34h,35h,30h,38h,32h变为4,5,0,8,2。
循环AD2就是实现数据的相加,不过此处还用到了ADC,也就是带进位的加法运算,所以此前就将CF清零了。
循环后data1里面的内容是8,4,2,5,6。
循环AD3后,data1里面的内容为38h,34h,32h,35h,36h;data2里面的内容为34h,35h,30h,38h,32h.
循环结束后,返回到主程序,程序运行到INT21h结束。
也就是说实验最后的结果就是执行完循环AD3后,data1和data2中的内容。
结果保存在内存中,地址为00h~09h(ds:
000038343235363435303832)
六、实验结果如下:
七、实验总结
第一次做微机原理的实验,开始看了老师发给我们的实验内容和操作细节但是还是有很多的东西不是很清楚,感觉是模拟两可的。
在老师的讲解下,知道首先要将masm这个文件夹放在D盘里面,然后再在masm这个文件夹里面建一个文本文档,如xiangj.asm,然后再运行。
先masm.exexiangj.asm。
若程序报错,则要在记事本里面修改,直至编译没有错误为止,这时候会自动生成一个xiangj.obj文件。
然后链接,link.exexiangj.obj,执行之后敲xiangj.exe就可以运行程序了。
这是我觉得第一做微机原理的实验学习到最能让我永远记得的东西。
至于实验的程序,刚开始根本就看不懂,由于里面涉及的很多知识都是我们还没有学到的,这就给我们看程序以及程序的功能的阅读带来了很大的阻碍。
也直到现在,我才看懂这个程序。
我觉得做实验最重要的是细心和耐心,还有就是要预习。
那样才能够提前知道可能会出现什么样的状况,自己能有有余地去解决这个问题。
即使自己解决不了的能够在实验室的时候去问老师,在老师的讲解下能明白的更彻底些。
实验二排序实验
一、实验目的
掌握用汇编语言编写排序程序的思路和方法。
二、实验内容
将指定内存出开始的数据(最多为4位数)按从大到小的顺序排列。
第一个数字表示数据的个数(不是要比较的数值!
!
!
)。
三、程序流程图
图3-2
四、实验所用程序
DATASEGMENT
ADDRDW8,234,35,67,876,54,39,765,237
DATAENDS
STACKSEGMENT
STADW32DUP(?
)
TOPDW
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAX,STACK
MOVSS,AX
MOVSP,TOP
MOVCX,WORDPTRADDR[0]
DECCX
LOOP1:
MOVDI,CX
MOVBX,2
LOOP2:
MOVAX,WORDPTRADDR[BX]
CMPAX,WORDPTRADDR[BX+2]
JGECCC
XCHGAX,WORDPTRADDR[BX+2]
MOVWORDPTRADDR[BX],AX
CCC:
ADDBX,2
LOOPLOOP2
MOVCX,DI
LOOPLOOP1
EXIT:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
五、实验程序分析及预计结果
DATASEGMENT
ADDRDW8,234,35,67,876,54,39,765,237;定义9个字,注意:
数字8是要排序的数据的个数
DATAENDS
STACKSEGMENT
STADW32DUP(?
)
TOPDW?
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAX,ACK
MOVSS,X
MOVSP,TOP
MOVCX,WORDPTRADDR[0];将0008H赋给CX
DECCX;将CX中的数据减1,用于控制循环次数
LOOP1:
MOVDI,CX
MOVBX,2
LOOP2:
MOVAX,WORDPTRADDR[BX];将BX中的数据00EA(234)给AX
CMPAX,WORDPTRADDR[BX+2];将下一个数据与00EA相比较
JGECCC;比较之后AX中的数大于或等于BX+2中的数则跳转到执行CCC
XCHGAX,WORDPTRADDR[BX+2];如果AX中的数小于BX+2中的数则交换两者的位置
MOVWORDPTRADDR[BX],AX
CCC:
ADDBX,2
LOOPLOOP2
MOVCX,DI
LOOPLOOP1
EXIT:
MOVAX,4C00H;跳出程序
INT21H
CODEENDS
ENDSTART
预计结果:
经过分析程序的最后的排序结果是036C02FD00ED00EA0043003600270023
程序设计思路:
冒泡排序法
六、实验结果如下
七、实验中存在的问题及分析
1、看不懂程序还是主要的问题,开始看的时候不知道定义中的第一个数据是要排序的数据的个数
2、这个程序循环的次数比较多,没耐心去分析这个程序的功能。
3、有很多指令的功能不清楚,给分析程序带来了很大的困难。
实验三自编程序上机调试
一、实验目的
掌握用汇编语言编写排序程序的思路和方法。
二、实验内容
选作业题中题目上机调试。
用汇编实现多位十六进制数相加
DATASEGMENT;高位在前,个位最后
xdb0,45h,21h,0ADh,0CBh,54h,59h,44h,55H;4521ADCB54594455H
ydb0,45h,21h,0BAh,0DCh,78h,59h,44h,55H;4521BADC78594455H
zdb9dup(0);累加和存放区
DATAENDS
;
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
movax,DATA
movds,ax
movsi,offsety
decsi;SI指向x的个位
movdi,offsetz
adddi,8;指向z的个位
clc
movcx,9
next:
moval,[si];逐位相加
adcal,[si+9]
mov[di],al;保存一位和
decsi
decdi
loopnext
movah,7;暂停
int21h
movah,4ch;返回DOS
int21h
CODEENDS
ENDSTART
;经与计算器验证,运行结果准确。
4521ADCB54594455H+4521BADC78594455H=8A4368A7CCB288AAh
>debugsadd.exe
-......
-d0
13DE:
0000004521ADCB545944-55004521BADC7859
13DE:
00104455008A4368A7-CCB288AA0000000000
实验四8255并行I/O口实验
一、实验要求
利用8255可编程并行口芯片,实现输入/输出实验,实验中用8255PA口作输入,PB口作输出。
二、实验目的
1、了解8255芯片结构及编程方法。
2、了解8255输入/输出实验方法。
三、预备知识
8255是Intel公司生产的与Intel8080/8085系列的MPU配套的可编程外围接口电路,简称PPI。
它有A、B、C三个八位端口寄存器,通过24位端口线与外部设备相连,基中C口可分为上半部和下半部。
这24根端口线全部为双向三态。
三个端口可分二组来使用,可分别工作于三种不同的工作方式。
四、实验原理图及连线
1、本实验主要用到的模块:
8255模块、开关量输出模块、0-1指示模块、实验译码单元等;
2、PA0-PA7分别接开关量输出模块S0-S7对应的插座;
3、PB0-PB7分别接0-1指示模块DO71-DO78对应的插座;
4、8255A的片选/CS接地址译码单元的2A0-2A7;
5、数据线XD0—XD7接系统数据线区的任一插座。
图3-3
五、实验内容
将实验的线路连接好后,编程,将8255的A口作为输入,输入信号由8个逻辑电平开关提供,B口作为输出,其内容由发光二极管来显示
六、程序框图
见图3-4。
图3-4
七、实验步骤
1、参照图中的内容连好线;
2、运行上位机软件,装载并运行相应程序即可(联机请参考程序8255.asm)。
注意:
同学们自己编写程序时,8255的/CS连线可以接地址译码单元的其他信号,其它连线相同。
如果用的端口与本实验不一样,也可以改变IO口的连线。
八、仪器配置
ZY15MicInt12BB微机原理及接口实验箱一台。
九、实验现象
当读到某个开关处于高电平时,对应的发光二极管就会亮。
十、实验有关的程序
L8255_CMDEQU2A3H
L8255_PAEQU2A0H
L8255_PBEQU2A1H
L8255_PCEQU2A2H
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE
BEGIN:
MOVCX,0FFH
AA:
LOOPAA
MOVDX,L8255_CMD
MOVAL,9CH;10011000
OUTDX,AL
NOP
NOP
NOP
NOP
NOP
BB:
MOVDX,L8255_PA
INAL,DX
XORAL,0FFH
MOVDX,L8255_PB
OUTDX,AL
JMPBB
CODEENDS
ENDBEGIN
十一、程序的分析
此程序比较简单,经分析知道,当程序执行到JMPBB时会开始循环,又由于该指令是无条件跳转指令,且没有控制指令,循环进入死循环,在debug里面调试不出来。
十二、实验总结
第一次接触微机原理试验箱,第一次根据原理图连线,连线相对于其他科目的连线是要简单很多的。
按照原理图连接好线之后,按操作步骤进行操作后结果出来了,虽然不知道原因。
在电脑和实验箱子连接的时候出了一点问题,在同学的帮助下那个实验箱子接口的问题得到了顺利的解决。
实验五8259A中断实验
一、实验要求
掌握用8088/86控制8259可编程中断控制器,实现对外部中断的响应和处理。
二、实验目的
了解8088/86与8259之间的连接方法。
学习8088/86对8259的控制方法。
三、预备知识
8259A是Intel公司专为控制优先级中断而设计的NMOS芯片。
它集中断源优先级排队、中断源识别、中断向量提供和中断屏蔽等功能电路于一体,因而中断系统无需附任何电路,只需对8259A进行编程,就可管理8级优先中断,且中断请求方式和优先级模式等中断结构可通过编程设定或变更,中断入口地址也可由用户任意指定。
四、实验原理说明及连线
1、本实验主要用到的模块:
中断模块、单次脉冲源模块等;
2、IR6接单次脉冲的/Q端。
图3-5
五、实验内容
用单脉冲发生器的输出脉冲作为中断源,每按一次按键产生一次中断申请,中断服务程序将在实验箱的显示屏显示一个字符“R”。
六、程序框图
主程序框图见图3-6;
中断程序框图见图3-7。
图3-6图3-7
1、确认连接好线路;
2、装载并运行程序(联机时请参考程序8259.asm)。
八、仪器配置
ZY15MicInt12BB微机原理及接口实验箱一台。
九、实验现象
当中断发生时,实验箱屏幕将会显示字符R(编程时,如果要往屏幕送字符,请往端口88H送字符即可)。
十、实验所用的程序
UCODESEGMENT
ASSUMECS:
UCODE
BEGIN:
JMPBEGIN_
INT_SEGDW?
INT_OFFDW?
BEGIN_:
CLI
MOVAH,35H
MOVAL,0EH
INT21H
MOVINT_OFF,BX
MOVINT_SEG,ES
MOVAX,CS
ADDAX,10H
MOVDS,AX
MOVAH,25H
MOVAL,0EH
MOVDX,OFFSETUINTR
INT21H
INAL,21H
ANDAL,0BFH
MOVDX,21H
OUTDX,AL
STI
JMP$
UINTRPROCFAR
CLI
MOVDX,88H
MOVAL,'R'
OUTDX,AL
MOVAL,20H
OUT20H,AL
IRET
UINTRENDP
UCODEENDS
ENDBEGIN
十一、实验程序的分析
该程序主要应用了DOS的功能调用,主要用的是35号和25号功能,35号功能的具体作用是:
35取中断向量AL=中断类型ES:
BX=中断向量;25号调用的功能是:
25设置中断向量DS:
DX=中断向量AL=中断类型号。
实验六ADC0809A/D转换实验
一、实验目的
1、加深理解逐次逼近法模数转换器的特征和工作原理;
2、掌握A/D转换芯片与8088/86的接口方法;
3、了解A/D芯片ADC0809转换性能及编程方法。
二、预备知识
A/D转换器大致有三类:
一是双积分A/D转换器,优点是精度高,抗干扰性好;价格便宜,但速度慢;二是逐次逼近A/D转换器,精度,速度,价格适中;三是并行A/D转换器,速度快,价格也昂贵。
实验用的ADC0809属第二类,是八位A/D转换器。
每采集一次一般需100us。
本程序是用延时查询方式读入A/D转换结果,也可以用中断方式读入结果,在中断方式下,A/D转换结束后会自动产生EOC信号,做为转换完成的信号。
三、实验原理说明及连线
1、本实验的位置在实验箱的“ADC0809模块”;
2、本实验用芯片ADC0809的片选地址为2B8H,实验箱上已固定好,不需要再连线;
3、将该实验模块的CLOCK和“信号源模块”的1MHz信号连接起来;
4、用排线将“系统数据总线输出单元”中的任意一组数据线和本实验模块的“ADC0809:
XD0-XD7”连接起来;
5、将通道0模拟量输入端IN0接模拟信号产生电路模块中的电位器R093的中心抽头,然后将R093的两端一端接地,另一端接VCC(+5V)。
图3-8
四、实验内容
利用电位器输出一个幅值可调的直流电压信号,送入ADC0809的通道0,将转换后的结果在屏幕上显示出来,并验证它与输入电压的关系。
五、实验步骤
1、确认连接好线路2、装载运行程序(联机时请参考程序0809.asm)。
六、实验框图
图3-9
七、实验现象
当程序开始运行后,实验箱上会出现十六进制数字0000到ffff一直闪动,把开关旋钮到最开始时候显示0000,最后是ffff
八、实验所用程序
CODESEGMENT
ASSUMECS:
CODE
START:
MOVDX,2B8H;2B0H-2B7H
MOVAL,00H
OUTDX,AL
CALLDELAY
INAL,DX
CALLSHOW
CALLDELAY
JMPSTART
SHOWPROCNEAR
PUSHDX
PUSHAX
MOVCL,4
SHRAL,CL
ANDAL,0FH
CALLH2C
JCSHOW_OUT
MOVDX,88H
OUTDX,AL
POPAX
ANDAL,0FH
CALLH2C
JCSHOW_OUT
MOVDX,88H
OUTDX,AL
MOVCX,0FFH
DELA:
LOOPDELA
SHOW_OUT:
POPDX
RET
SHOWENDP
H2CPROCNEAR
CMPAL,0
JAEN0_9
JMPH2C_ERR
N0_9:
CMPAL,9
JBEN0_9_OK
CMPAL,0AH
JAEHEX_CMP
JMPH2C_ERR
HEX_CMP:
CMPAL,0FH
JBEHEX_CMP_OK
JMPH2C_ERR
HEX_CMP_OK:
CLC
ADDAL,37H
JMPCMP_OUT
N0_9_OK:
CLC
ADDAL,30H
CMP_OUT:
RET
H2CENDP
DELAYPROCNEAR
MOVCX,0FFH
DELEA:
LOOPDELEA
RET
DELAYENDP
CODEENDS
ENDSTART