四川大学微机原理实验报告.docx
《四川大学微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《四川大学微机原理实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
四川大学微机原理实验报告
微机原理试验汇报
学院:
专业班级:
姓名
学号
试验一汇编语言编程基础
1.3汇编语言程序上机操作和调试训练
一.功效说明
利用8086汇编语言,编辑多字节非压缩型BCD数除法简单程序,文件名取为*.ASM。
利用MASM﹒EXE文件进行汇编,修改程序中多种语法错误,直至正确,形成*.OBJ文件。
利用LINK.EXE文件进行连接,形成*.EXE文件。
仔细阅读和体会DEBUG调试方法,掌握多种命令使用方法。
利用DEBUG。
EXE文件进行调试,使用单步实施命令—T两次,观察寄存器中内容改变,使用察看存放器数据段命令—D,观察存放器数据段内数值。
再使用连续实施命令—G,实施程序,检验结果是否正确,若不正确可使用DEBUG设置断点,单步实施等功效发觉错误所在并加以更正。
二.程序步骤图
设置被除数、商地址指针
设置单位除法次数计数器
取被除数一位作十进制调整
作字节除法、存商
N被除数各位已除完?
Y
显示运算结果
结束
三.程序代码
修改后程序代码以下:
DATASEGMENT
ADB9,6,8,7,5
BDB5
CDB5DUP(0)
NEQU5
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
CLD
LEASI,A
LEADI,C
MOVCX,N
MOVAH,0
LP1:
LODSB
AAD
DIVB
STOSB
LOOPLP1
MOVCX,N
LEADI,C
LP2:
MOVDL,[DI]
ADDDL,30H
MOVAH,2
INT21H
INCDI
LOOPLP2
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
四.试验感想和收获
经过这次试验,我对微机原理上级试验环境有了初步认识,能够较为熟练地对汇编语言进行编译,汇编及连接,同时也学会了用DEBUG调试程序,收获很大。
在这次试验中我也碰到了部分困难。
在刚开始我发觉自己无法打开MASM.EXE,计算机提醒是因为版本不兼容。
我这才想起来我操作系统是64位,和该软件版本不兼容。
不过我并没有放弃,经过我探索以后,我发觉用DOSBOX这个程序能够处理我电脑运行不了该程序问题。
在处理了第一个难题后,我开始着手更正试验1.3中语法错误和逻辑错误,不过不管我怎么修改却一直都无法经过编译,而且基础上每句话都有编译错误。
依据我多年编程经验来看,这应该是汉字输入法在搞鬼,以后我耐心地把程序重新输了一遍,果然经过了编译,而且以后连接也进行很顺利。
在用DEBUG调试时发认为出结果也很正确。
尽管这次试验内容非常简单,仅仅是教会我们部分基础操作,但我却显著感觉到了汇编语言和C语言等高级语言所不一样地方。
越是底层,基础东西就越不人性化,用C语言一行代码就能试验功效在汇编语言中可能要花上数十行。
看来汇编语言学习不是几周就能速成,必需要有终年累月积淀才能掌握。
试验二设计汇编语言程序
一.功效说明
练习1.试验题目:
编程计算下列表示式:
A=90,B=-70,C=5,Y均为有符号数,计算Y=2×(A+B)+(A×C)÷5
要编写部分稍微复杂程序,我们会碰到一段程序被反复实施,这么,我们会用到LOOP指令。
使用该指令时,需在CX中装入循环次数。
练习2.码转换程序设计
编制程序,把十进制数15786转化成二进制数。
提醒:
15786=1×10×10×10×10+5×10³+7×10²+8×10+6,循环CX=5
练习3.编制程序,从键盘输入最多5个数,求她们和,存入SUM。
练习4.用“冒泡“法对一组数300,250,280,240,260,按从小到大次序排列。
提醒:
用冒泡方法对一组数据元素排序,它基础方法是:
将相邻两个元素经过比较进行排序,经过数次,多遍邻元素排序,实现整个一组数排序。
对于5(N)个元素,整个排序经过4遍(=N-1)邻元素排序完成。
每一遍排序由若干次邻元素排序组成。
4遍排序中,邻元素排序依次为4,3,2,1遍。
完成第一遍排序后,最大数沉底,已经抵达它应占据位置,不需要参与下一遍排序。
外循环次数为CX=4次(N-1),内循环次数为4,3,2,1(DECCX)
排序遍数
本遍排序前
第一次排序后
第二次排序后
第三次排序后
第四次排序后
1
300,250,280,240,260
250,300,280,240,260
250,280,300,240,260
250,280,240,300,260
250,280,240,260,300
2
250,280,240,260,300
250,280,240,260,300
250,240,280,260,300
250,240,260,280,300
3
250,240,260,280,300
250,240,260,280,300
240,250,260,280,300
4
240,250,260,280,300
240,250,260,280,300
试验要求:
1.编制程序,从键盘输入300,250,280,240,260这五个数,并思索怎样输入任意五个数,五个数能够有一位数,二位数,三位数,四位数,五位数,混合输入比较大小;
2.对这组数用冒泡法进行排序,并输出原始数据及排序后数据,两两数据之间用空格分隔;
3.利用DEBUG调试工具,用D0命令,查看排序前后,内存数据改变,以及会用调试命令查看程序运算中寄存器中值;
4.去掉最大和最小两个值,求出其它值平均值,并输出最大值,最小值和平均值;
5.用压栈PUSH和出栈POP指令“优异后出”特点,设计算法将平均值按位逐一输出(即输出263);
6.用移位指令将平均值以二进制串形式输出。
7.设计程序要有模块化思想,用子程序实现不一样功效;
全部数据输出前要用字符串输出指令,进行输出提醒(如:
zuidazhishi:
300等),全部数据结果能清楚地显示在电脑屏幕上。
二.程序步骤图
三.程序代码
练习一:
DATASEGMENT
ADB90
BDB-70
CDB5
YDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVBL,A
MOVCL,B
ADDBL,CL;A+B
MOVAL,02H
IMULBL;2*(A+B)
MOVBX,AX
MOVAL,A
MOVCL,C
IMULCL;A*C
IDIVCL;A*C/5
ADDAX,BX
MOVY,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
练习二:
DATASEGMENT
ADW15786
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVBX,A
MOVCX,16
LEFT:
TESTBX,8000H
JNZL1;当首位为1,实施L1
MOVDL,'0';输出‘0’
MOVAH,02H
INT21H
SHL:
SHLBX,1
LOOPLEFT
MOVAX,4CH
INT21H
L1:
MOVDL,'1';输出‘1’
MOVAH,02H
INT21H
JMPSHL
CODEENDS
ENDSTART
运行结果:
练习三:
DATASEGMENT
SUMDW?
HEHEDB?
?
?
?
?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,HEHE
MOVBL,0
MOVCX,5
LOOP1:
MOVAH,01H
INT21H
SUBAL,30H
MOV[SI],AL
INCSI
LOOPLOOP1
MOVCX,5
MOVAX,0
SUBSI,5
LOOP2:
ADDAL,[SI]
AAA
INCSI
LOOPLOOP2
MOVBX,AX
MOVSUM,AX
MOVDL,BH
ADDDL,30H
MOVAH,2
INT21H
MOVDL,BL
ADDDL,30H
MOVAH,2
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
运行结果:
冒泡排序法程序:
DATASSEGMENT
SHURUDB'QINGSHURU5GESHUJU',13,10,'$'
SHU1DB4,?
3DUP(?
)
SHU2DB4,?
3DUP(?
)
SHU3DB4,?
3DUP(?
)
SHU4DB4,?
3DUP(?
)
SHU5DB4,?
3DUP(?
)
AVERDB3DUP(?
)
SHUCHUDB'PAIXUHOUDESHUJUSHUNXUSHI',':
','$'
MAXDB'ZUIDAZHISHI',':
','$'
MINDB'ZUIXIAOZHISHI',':
','$'
AVERAGEDB'PINGJUNZHISHI',':
','$'
CHUSHUDB100,10
HEDW?
STR1DB16DUP(30H)
STR2DB'PINGJUNZHIDEERJINZHICHUANSHUCHU',':
','$'
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
LEADX,SHURU;显示QINGSHURU5GESHUJU:
MOVAH,9
INT21H
MOVCX,5;输入五个数字
MOVSI,0
INPUT:
LEADX,[SHU1+SI];输入要排序原始数据
MOVAH,10
INT21H
MOVDL,10;输入后换行
MOVAH,2
INT21H
ADDSI,5;指针加5,指向下一个变量
LOOPINPUT
CLD
MOVCX,4;设定排序外循环次数
A:
MOVBP,0
PUSHCX;外循环次数入栈
PX:
PUSHCX
MOVCX,3
LEASI,[SHU1+BP+2];逐位比较两个数大小
LEADI,[SHU1+BP+7]
REPZCMPSB
JBB;假如小于直接比较下一个数,不然两个数对换位置
MOVCX,3
Jh:
MOVAL,SHU1[BP+2]
XCHGAL,SHU1[BP+7];将两个字节对换位置,循环3次即完成这两个数交换
XCHGAL,SHU1[BP+2]
INCBP
LOOPJh
SUBBP,3
B:
ADDBP,5;指向后面两个数字
POPCX
LOOPPX
POPCX;外循环次数出栈
LOOPA
LEADX,SHUCHU;输出字符串'PAIXUHOUDESHUJUSHUNXUSHI:
'
MOVAH,9
INT21H
MOVCX,5
MOVSI,2
OUTPUT:
PUSHCX;计数器入栈实现循环嵌套
MOVCX,3
L:
MOVAL,[SHU1+SI];输出排序后5个数字
MOVDL,AL
MOVAH,2
INT21H
INCSI
LOOPL
MOVDL,2CH
MOVAH,2
INT21H
ADDSI,2
POPCX;计数器出栈
LOOPOUTPUT
MOVDL,10
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
LEADX,MAX;输出字符串'ZUIDAZHISHI:
'
MOVAH,9
INT21H
MOVCX,3
MOVSI,2
D:
MOVDL,[SHU5+SI];输出最大值
MOVAH,2
INT21H
INCSI
LOOPD
MOVDL,10;换行
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
LEADX,MIN;输出字符串'ZUIXIAOZHISHI:
'
MOVAH,9
INT21H
MOVCX,3
MOVSI,2
E:
MOVDL,[SHU1+SI];输出最小值
MOVAH,2
INT21H
INCSI
LOOPE
MOVDL,10
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
LEADX,AVERAGE;输出字符串'PINGJUNZHISHI:
'
MOVAH,9
INT21H
MOVCX,3
MOVBX,10;除数10
MOVSI,2
AD:
MOVDX,0
MOVAH,0
PUSHCX
MOVCX,3
ZH:
MOVAL,[SHU2+SI];将十进制数转换为二进制数,为后面求平均值做准备
SUBAL,30H
PUSHAX
MOVAX,DX
MULBX
MOVDX,AX
POPAX
ADDDX,AX
INCSI
LOOPZH;实施3次完成3个十进制数转换
ADDSI,2
POPCX
ADDHE,DX;将DX数放在HE中
LOOPAD;循环后得到三个十进制数转换为二进制数以后相加和
MOVDX,HE;
MOVAX,DX
XORDX,DX
MOVBX,3
DIVBX;除3取平均值,结果将商放在AX中,余数放在DX中
MOVBX,AX;给BX赋值平均数,然后将BX中表示十进制数转换为对应字符串
DIVCHUSHU;除100取最高位
ADDAL,30H;转换为ASCII码
MOVAVER,AL
MOVAL,AH
XORAH,AH
DIV[CHUSHU+1];除10取十位
ADDAL,30H
ADDAH,30H;余数就是个位
MOV[AVER+1],AL
MOV[AVER+2],AH
MOVCX,3
MOVSI,0
F:
MOVDL,[AVER+SI];输出平均值
MOVAH,2
INT21H
INCSI
LOOPF
MOVDL,10
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
LEADX,STR2;输出字符串'PINGJUNZHIDEERJINZHICHUANSHUCHU:
’
MOVAH,9
INT21H
MOVCX,16
MOVSI,0
G:
RCLBX,1;将平均数转换为二进制串
JNCH
ADD[STR1+SI],1;假如不为0就将其加1变成1ASCII码值
H:
MOVDL,[STR1+SI];将二进制串逐一输出
MOVAH,2
INT21H
INCSI
LOOPG
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
运行结果:
四.试验感想和收获
此次试验相较于第一次难度增大了很多,本人花了大约12个小时才做完。
第一个练习很简单,从编译到连接都是一次经过,在用DEBUG调试发觉结果却实正确。
不过在做第二个练习时我碰到了困难,完全没有思绪。
当初不知道怎么对一位一位数据进行操作,在看书过程中无意中发觉了循环指令,我才意识到用SHL指令能够实现这个功效。
第三个联络关键考查我们对中止指令了解程度,我实现地是一位数加法,不过以后老师发给了我们她自己编版本,我感慨道编程真是一门大学问,要考虑到多种多样功效,人机互动,可能犯错地方。
这都是需要大量实践积累才行。
在编写冒泡排序法这个程序时我碰到了很多困难。
起初在编写一段循环指令时,未把寄存器CX入宅,所以影响了其她部分循环次数,造成结果犯错。
所以以后编程时一定要把有用信息入宅,预防被其她指令所改变。
在输出字符时,必需记得把要输出字符值转变成ASCI码,我期初输出数字时就忘记了这一步造成出了很多差错。
同时在将二进制数转变成BCD吗输出时能够经过除10来实现,将得到商继续除10,而得到余数就是个位值,同理,再次除10得到余数就是10位。
所以经过合适此处出发能够将二进制数转变为BCD码。
经过亲身实践这次试验,对汇编语言编程有了初步认识,也体会到了编程整个过程。
从读题,设计程序框架到写代码,步步承接,同时将课堂上所学知识利用起来,在加深了解同时也发觉了自己很多不懂地方,于是经过自己查资料,问老师最终将程序一步步地调试正确得出期望结果,那种自豪和满足感油然而生。
第三次试验8253定时器/计数器与接口试验
——乐曲程序
一.功效说明
计算机是怎样产生音乐和声响呢?
原来在计算机中有一个可编程时间间隔定时器8253,它能依据程序提供计数值和工作模式,产生多种形状和多种频率计数/定时脉冲,提供给系统各个部件使用。
它还能够产生不一样频率脉冲作为扬声器声源。
在8253定时器内部有3个独立工作计数器:
Counter0,Counter1,Countre2,每个计数器都分配有一个端口地址,分别是40H,41H,42H。
8253内部还有一个公用控制寄存器,端口地址为43H,端口地址输入到8253CS,A1,A0端,分别对三个计数器和控制器寻址。
对8253编程时,先要设定控制字,以选择计数器,确定工作模式和计数值格式,每个计数器由三个引脚与外部联络,CLK为时钟输入端,GATA为门控制信号输入端,OUT为计数/定时信号输入端。
每个计数器是以倒计数方法计数,也就是说,从计数初值开始逐次减1,直到减为0为止。
端口地址与计数器关系:
40H
选中计数器0:
作为定时器为系统日时钟提供计时基准
41H
选中计数器1:
作为定时器使用
42H
选中计数器2:
用来控制扬声器发声
43H
公用控制器:
分别对三个寄存器和控制器寻址
那么,怎样触动扬声器发出声音呢?
原来PC机主音箱上装有一只小喇叭,由定时器8253和并行接口芯片8255(可编程外围接口芯片)控制其发声,8255包含三个8位寄存器,两个用于输入功效,一个用于输出功效。
输入寄存器分配I/O端口地址为60H和62H,输出寄存器分配I/O端口地址为61H。
8253定时器计数器2连接到扬声器,其电路以下:
8253DRIVER
1.9318MHZCLK喇叭
OUT2
8255
PB0GATE2
PB1
装入计数器2计数初值为533H(1.19318MHz/896Hz=1331=533H),这么,得到控制字为10110110B=0B6H,即选中计数器2,读/写,工作方法三(方波发声器),二进制。
计数器2初始化程序为:
MOVAL,0B6H
OUT43H,AL
1)计算计数值程序段:
MOVDI,给定频率
MOVDX,12H
MOVAX,34DCH
DIVDI
AX中即为计数值。
2)打开扬声器发声,8255PB0,PBI送出高电平:
INAL,61H
ORAL,3
OUT61H,AL
3)关闭扬声器,停止发声:
INAL,61H
ANDAL,0FCH
OUT61H,AL
两只老虎音频表定义在数据段中,以下:
STACKSEGMENT
DW100DUP(?
)
STACKENDS
DATASEGMENT
MUSICDW2DUP(262,294,330,262);频率表,1231;1231
DW2DUP(330,349,392);345;345;
DW2DUP(392,440,392,349,330,262);565431;565431
dw2dup(294,196,262),0;251;251,0表示结束
TIMEDW10DUP(250*50),500*50,250*50,250*50,500*50;节拍表
DW2DUP(120*50,120*50,120*50,120*50,250*50,250*50)
DW2DUP(250*50,250*50,500*50)
NEQU32;32个音符
DATAENDS
二.试验目:
学习8253计数器2输出方波信号用以驱动扬声器发声原理,经过程序设置计数器2输出波形频率和延续时间,控制扬声器音调和发生长短。
三.试验内容:
1.设计程序让微机演奏一段两只老虎乐曲。
2.思索怎样让PC机演奏一遍,两遍以及数遍这段两只老虎乐曲,并修改程序实现。
四.试验汇报:
整理出运行正确源程序清单(加以汉字注释),并给出具体程序步骤图。
三.程序代码
DATASSEGMENT
BGDB0AH,0DH,”TWOTIGER:
$”
FREQDW2DUP(262,294,330,262)
DW2DUP(330,349,392)
DW2DUP(392,440,392,349,330,262)
DW2DUP(294,196,262),0;频率表