四川大学微机原理实验报告.docx
《四川大学微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《四川大学微机原理实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
四川大学微机原理实验报告
《微机原理与接口技术实验报告》
学院:
电气信息学院
班级:
109班
老师:
罗江陶
学号:
1143031270
姓名:
实验一汇编语言程序的上机步骤
1、实验目的:
1、了解汇编语言程序的执行流程。
2、熟悉和使用DEBUG调试工具,分析和读懂一些与硬件相关的小程序。
3、通过对程序的分析,理解计算机程序的执行过程。
4、了解并逐步熟悉汇编语言的编辑方法及特点.
5、复习8086汇编语言的段结构、常用的指令与伪指令、存储空间的分配等。
6、掌握汇编语言的编辑、汇编及连接的过程。
7、了解并逐步掌握运用DEBUG进行调试汇编语言程序
二、实验内容:
以文件名为1.asm源程的序为例,学习汇编语言的上机步骤。
汇编语言程序MASM软件由EDIT.COM编辑器,汇编MASM.EXE程序,连接LINK.EXE程序以及DUEBUG.EXE调试程序四个部分组成。
汇编语言编制完成后,在计算机上的操作过程就分为四个阶段。
1.编辑EDIT.COM:
首先输入源程序:
在记事本里录入,注意在保存时文件格式必须选择所有文件,文件后缀名为.ASM,即保存时文件名为XXX.asm。
2.用汇编程序MASM.Exe对源程序.ASM文件汇编,生成目标文件.OBJ:
双击MASM软件中的MASM.Exe文件框,在命令行后键入源程序名XXX.asm,(如果源程序与MASM软件在同一路径下,可以只键入文件名,而不要后缀)
3.连接LINK.EXE双击MASM软件中的LINK.Exe文件框,在命令行后键入目标文件名XXX.OBJ(如果源程序,目标文件与MASM软件在同一路径下,可以只键入文件名,而不要后缀)如果连接没有错误,就会产生一个XXX.EXE的可执行文件,如果.OBJ文件有错误,连接时会指出错误的原因。
4.运行和调试DEBUG.exe运行可执行文件,即双击XXX.EXE文件框即可,或在DOS下运行此程序,E:
\XXX.EXE。
3、程序流程图:
汇编语言源程序
结果
4、程序清单与注释:
DATASEGMENT
NUM1DB35,35H
NUM2DW35,35H
NUM3DB4DUP(34,3DUP(34H))
NUM4DB'34AB'
NUM5DW'34','AB'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETNUM1
MOVAL,[BX]
MOVBX,OFFSETNUM5
MOVAX,[BX]
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
五、运行结果:
将以上程序在笔记本中保存为xueyuan1.ASM
编译后显示编译成功:
运行结果如下:
运行可执行文件出现此界面后“闪退”
六、实验心得:
通过本次实验,我了解了一个汇编程序在计算机上的执行步骤,如何实现一个汇编程序的编辑、连接、运行。
能看懂一些十分简单的汇编小程序。
汇编语言是一种面向机器的“低级”语言,是计算机能够提供给用户的最快而最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。
要真正理解计算机的工作过程,理解计算机程序的执行过程,就必须学习汇编语言。
也正是因为如此,汇编语言程序设计是计算机专业和电子,自动控制等相关专业的重要课程。
实验二汇编语言程序设计
-------------循环结构程序
一、实验目的:
1.理解8086各种指令的功能。
2.进一步学习程序的调试。
3.掌握循环结构程序的设计编程。
二、实验内容:
用“冒泡“法对一组数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.设计程序要有模块化的思想,用子程序实现不同的功能;
8.所有数据输出前要用字符串的输出指令,进行输出提示(如:
zuidazhishi:
300等),所有数据结果能清晰地显示在电脑屏幕上。
三、程序流程图:
子程序有:
SRZH(输入转化)子程序,XS(显示)子程序,PAIXU(排序)子程序。
四、程序清单与注释:
DSEGSEGMENT
SRDB40,?
20DUP(?
)
VARDW5DUP(0)
AVGDW?
MDW10
PDW3
DDW2
SHURUDB'QINGSHURUSHUJU:
','$'
XS1DB0DH,0AH,'YUANSHISHUJU:
','$'
XS2DB0DH,0AH,'PAIXUHOUSHUJU:
','$'
XS3DB0DH,0AH,'ZUIDAZHISHI:
','$'
XS4DB0DH,0AH,'ZUIXIAOZHISHI:
','$'
XS5DB0DH,0AH,'PINGJUNZHISHI:
','$'
XS6DB0DH,0AH,'ERJINZHIPINGJUNZHISHI:
','$'
DSEGENDS
STACKSEGMENT
DW100DUP(?
)
STACKENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG,SS:
STACK,ES:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVES,AX
MOVDX,OFFSETSHURU;显示输入的提示符
MOVAH,09H
INT21H
LEADX,SR
MOVAH,0AH;输入待排序的字符
INT21H
CLD
MOVCX,5
LEASI,SR
ADDSI,2
LEADI,VAR
LOOPS:
CALLSRZH;调用子程序SRZH进行转化
LOOPLOOPS;循环5次
MOVDX,OFFSETXS1;显示未排序的提示符
MOVAH,09H
INT21H
MOVCX,5
LEASI,VAR
LOOP1:
CALLXS;调用子程序XS进行未排序的数据显示
LOOPLOOP1;循环5次
CLD
MOVCX,4
MOVDX,1
LOOP2:
CALLPAIXU;调用子程序PAIXU进行排序
INCDX
LOOPLOOP2
MOVDX,OFFSETXS2
MOVAH,09H
INT21H
MOVCX,5;计数寄存器CX置5才能显示5个数
LEASI,VAR
LOOP3:
CALLXS;调用子程序XS进行排序后结果显示
LOOPLOOP3
MOVDX,OFFSETXS3;输出最大值
MOVAH,09H
INT21H
LEASI,VAR
ADDSI,8;SI要进行加8处理后指向排在最后的最大值
CALLXS
MOVDX,OFFSETXS4;输出最小值
MOVAH,09H
INT21H
LEASI,VAR
CALLXS
MOVDX,OFFSETXS5;输出去掉最大最小值的平均值
MOVAH,09H
INT21H
MOVAX,[SI]
MOVBX,[SI+2];取第二个数据
ADDAX,BX
MOVBX,[SI+4];取第三个数据(这样相加相当于去掉了最大最小值)
ADDAX,BX
CWD
IDIVP;把相加和除以三来求得平均值
LEASI,AVG
MOV[SI],AX;把求得的平均值存入AVG
CALLXS
MOVDX,OFFSETXS6;输出2进制的平均数
MOVAH,09H
INT21H
MOVCX,16
LEASI,AVG
MOVAX,[SI]
LP2:
CWD
IDIVD;采用不断除以二并压入栈的方式得到数据的二进制表示方式
PUSHDX
LOOPLP2
MOVCX,16
LP3:
POPDX
ADDDL,30H;将数据弹出站并且加30H进行ASCII的转换显示
MOVAH,2
INT21H
LOOPLP3
MOVAH,4CH
INT21H
SRZHPROC;输入转化子程序
MOVBX,2;BX取2,可以循环3次,相当于把3个字节的数转化为1个字
MOVDX,0
ZH1:
MOVAX,0
LODSB;从SR串中读出数据
SUBAL,30H
ADDDX,AX
MOVAX,DX
MULM
MOVDX,AX
DECBX
JNZZH1
MOVAX,DX
STOSW;把字数据以16进制存入VAR数据串中
INCSI
INCSI;跳过3位数后面的空格或逗号
RET;输入转化子程序结束
SRZHENDP
XSPROC;显示子程序
LODSW
MOVBX,3;数据在十进制时的是三位数所以计数部分BX置三
ZL1:
CWD
IDIVM;采用除以16的方法不断得到每一位数
PUSHDX;将每一位压入栈
DECBX
JNZZL1
MOVBX,3
ZL2:
POPDX;压完一个数后立即出栈进行显示
ADDDL,30H
DECBX
MOVAH,2
INT21H
JNZZL2
MOVDL,20H;每个数据间由空格隔开
MOVAH,2
INT21H
RET;显示子程序结束
XSENDP
PAIXUPROC;排序子程序
PUSHCX
MOVCX,5
SUBCX,DX
MOVSI,0
RECMP:
MOVAX,VAR[SI]
CMPAX,VAR[SI+2]
JLENOCH
XCHGAX,VAR[SI+2]
XCHGAX,VAR[SI]
NOCH:
INCSI
INCSI
LOOPRECMP
POPCX
RET;排序子程序结束
PAIXUENDP
CSEGENDS
ENDSTART
五、运行结果:
六、实验心得:
因为很容易出错,编辑的错误很容易找,通过masm.exe和edit.exe就能找到。
难的是算法和逻辑上的错误,看了很多遍程序总觉得没有错误,但是就是1个小问题就导致全部出错,比如我的这个程序里的SRZH(输入转化)子程序最后是有2行的INCSI,相当于SI加了2,就直接跳过数中间的空格或者逗号,但是如果只加了1行的话,程序能运行,但是最后输出的全是乱码。
实验三8253定时器/计数器与接口实验
------乐曲程序
一、实验目的:
学习8253计数器2输出方波信号用以驱动扬声器发声的原理,通过程序设置计数器2的输出波形的频率和延续时间,控制扬声器的音调和发生长短。
二、实验内容:
1.设计程序让微机演奏一段两只老虎的乐曲。
2.思考如何让PC机演奏一遍,两遍以及数遍这段两只老虎的乐曲,并修改程序实现。
三、程序流程图:
四、程序清单与注释:
DATASSEGMENT
DATASENDS
STACKSEGMENTPARASTACK'STACK'
SSSDW100DUP(?
);堆栈段代码
STACKENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAH,1
INT21H
MOVAH,0
SUBAX,30H
MOVCX,AX
AGAIN:
PUSHCX
MOVAX,DATAS
MOVDS,AX
MOVCX,2
A:
MOVBX,262;两只老虎
CALLYINYUE
MOVBX,294
CALLYINYUE
MOVBX,330
CALLYINYUE
MOVBX,262
CALLYINYUE
MOVBX,50
CALLDELAY
LOOPA
MOVCX,2
A1:
MOVBX,330;跑得快
CALLYINYUE
MOVBX,349
CALLYINYUE
MOVBX,392
CALLYINYUE
MOVBX,250
CALLDELAY
LOOPA1
MOVCX,2
A2:
MOVBX,392;一只没有耳朵,一直没有尾巴
CALLYINYUE1
MOVBX,440
CALLYINYUE1
MOVBX,392
CALLYINYUE1
MOVBX,349
CALLYINYUE1
MOVBX,330
CALLYINYUE
MOVBX,262
CALLYINYUE
MOVBX,50
CALLDELAY
LOOPA2
MOVCX,2
A3:
MOVBX,294;真奇怪
CALLYINYUE
MOVBX,196
CALLYINYUE
MOVBX,262
CALLYINYUE
MOVBX,250
CALLDELAY
LOOPA3
POPCX
DECCX
CMPCX,0
JNZAGAIN
MOVAH,4CH
INT21H
YINYUEPROCNEAR
MOVAX,34DCH;输出音符的特定频率
MOVDX,12H
DIVBX
OUT42H,AL
MOVAL,AH
OUT42H,AL
INAL,61H;开扬声器
ORAL,3
OUT61H,AL
PUSHCX;延时1s
MOVBX,500
DEL1:
MOVCX,2800
DEL2:
LOOPDEL2
DECBX
JNZDEL1
POPCX
INAL,61H;关扬声器
ANDAL,0FCH
OUT61H,AL
RET
YINYUEENDP
YINYUE1PROCNEAR
MOVAX,34DCH;输出音符的特定频率
MOVDX,12H
DIVBX
OUT42H,AL
MOVAL,AH
OUT42H,AL
INAL,61H;开扬声器
ORAL,3
OUT61H,AL
PUSHCX;延时0.5s
MOVBX,250
DEL1:
MOVCX,2800
DEL2:
LOOPDEL2
DECBX
JNZDEL1
POPCX
INAL,61H;关扬声器
ANDAL,0FCH
OUT61H,AL
RET
YINYUE1ENDP
DELAYPROCNEAR;子程序DELAY1,延时0.2s
PUSHCX
DEL1:
MOVCX,2800
DEL2:
LOOPDEL2
DECBX
JNZDEL1
POPCX
RET
DELAYENDP
CODESENDS
ENDSTART
五、运行结果:
六、实验心得
通过本次实验,我第一次用8253通过电脑发声,了解了其编程过程,学到了很多新的知识。
我理解了汇编语言中编程的基本步骤,掌握了通过地址对数据赋值的方法。
掌握芯片的使用方法,了解了计算机编程过程中的相关知识。
特别是能够是主板发出声音,我觉得很有成就感,自己编的小调尽管十分粗糙,我还是从中得到了快乐。