2023年四川大学微机原理实验报告

上传人:豆*** 文档编号:165971661 上传时间:2022-10-30 格式:DOC 页数:31 大小:638KB
收藏 版权申诉 举报 下载
2023年四川大学微机原理实验报告_第1页
第1页 / 共31页
2023年四川大学微机原理实验报告_第2页
第2页 / 共31页
2023年四川大学微机原理实验报告_第3页
第3页 / 共31页
资源描述:

《2023年四川大学微机原理实验报告》由会员分享,可在线阅读,更多相关《2023年四川大学微机原理实验报告(31页珍藏版)》请在装配图网上搜索。

1、微机原理实验报告学 院: 专业班级: 姓 名 学 号 实验一 汇编语言编程基础1.3汇编语言程序上机操作和调试训练一 功能说明 运用8086汇编语言,编辑多字节非压缩型BCD数除法的简朴程序,文献名取为*.ASM。运用MASMEXE文献进行汇编,修改程序中的各种语法错误,直至对的,形成*.OBJ文献。运用LINK.EXE文献进行连接,形成*.EXE文献。仔细阅读和体会DEBUG调试方法,掌握各种命令的使用方法。运用DEBUG。EXE文献进行调试,使用单步执行命令T两次,观测寄存器中内容的变化,使用察看存储器数据段命令D,观测存储器数据段内数值。再使用连续执行命令G,执行程序,检查结果是否对的,

2、若不对的可使用DEBUG的设立断点,单步执行等功能发现错误所在并加以改正。二程序流程图 设立被除数、商的地址指针 设立单位除法次数计数器 取被除数一位作十进制调整 作字节除法、存商 N 被除数各位已除完? Y 显示运算结果 结束 三程序代码修改后的程序代码如下:DATA SEGMENT A DB 9,6,8,7,5 B DB 5 C DB 5 DUP (0) N EQU 5 DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATA MOV DS,AX MOV ES,AX CLD LEA SI,A LEA DI,

3、C MOV CX,N MOV AH,0LP1: LODSB AAD DIV B STOSB LOOP LP1 MOV CX,N LEA DI,CLP2: MOV DL,DI ADD DL,30H MOV AH,2 INT 21H INC DI LOOP LP2 MOV AH,4CH INT 21HCODE ENDSEND START四实验感想和收获通过这次实验,我对微机原理上级实验环境有了初步的结识,可以较为纯熟地对汇编语言进行编译,汇编及连接,同时也学会了用DEBUG调试程序,收获很大。在这次实验中我也碰到了一些困难。在刚开始我发现自己无法打开MASM.EXE,计算机提醒是由于版本不兼容。我

4、这才想起来我的操作系统是64位的,和该软件版本不兼容。但是我并没有放弃,通过我的摸索之后,我发现用DOSBOX这个程序可以解决我的电脑运营不了该程序的问题。在解决了第一个难题后,我开始着手改正实验1.3中的语法错误和逻辑错误,但是无论我怎么修改却始终都无法通过编译,并且基本上每句话都有编译错误。根据我数年编程的经验来看,这应当是中文输入法在搞鬼,之后我耐心地把程序重新输了一遍,果然通过了编译,并且之后的连接也进行的很顺利。在用DEBUG调试时发现得出的结果也很对的。尽管这次的实验内容非常简朴,仅仅是教会我们一些基本的操作,但我却明显感觉到了汇编语言和C语言等高级语言所不同的地方。越是底层,基础

5、的东西就越不人性化,用C语言一行代码就能实验的功能在汇编语言中也许要花上数十行。看来汇编语言的学习不是几周就能速成的,必须要有长年累月的积淀才干掌握。 实验二 设计汇编语言程序一功能说明练习1. 实验题目:编程计算下列表达式:A=90,B=-70,C=5,Y均为有符号数,计算Y=2(A+B)+(AC)5要编写一些稍微复杂的程序,我们会碰到一段程序被反复执行,这样,我们会用到LOOP指令。使用该指令时,需在CX中装入循环次数。练习2.码转换程序设计编制程序,把十进制数15786转化成二进制数。提醒:15786=110101010+510+710+810+6,循环CX=5练习3.编制程序,从键盘输

6、入最多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(DEC CX)排序遍数本遍排序前第一次排

7、序后第二次排序后第三次排序后第四次排序后1300,250,280,240,260250,300,280,240,260250,280,300,240,260250,280,240,300,260250,280,240,260,3002250,280,240,260,300250,280,240,260,300250,240,280,260,300250,240,260,280,3003250,240,260,280,300250,240,260,280,300240,250,260,280,3004240,250,260,280,300240,250,260,280,300实验规定:1. 编制

8、程序,从键盘输入300,250,280,240,260这五个数,并思考如何输入任意五个数,五个数可以有一位数,二位数,三位数,四位数,五位数,混合输入比较大小;2. 对这组数用冒泡法进行排序,并输出原始数据及排序后数据,两两数据之间用空格分隔;3. 运用DEBUG调试工具,用D0命令,查看排序前后,内存数据的变化,以及会用调试命令查看程序运算中寄存器中的值;4. 去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;5. 用压栈PUSH和出栈POP指令“先进后出”的特点,设计算法将平均值按位逐个输出(即输出263);6. 用移位指令将平均值以二进制串的形式输出。7. 设计程

9、序要有模块化的思想,用子程序实现不同的功能;所有数据输出前要用字符串的输出指令,进行输出提醒(如:zui da zhi shi : 300等),所有数据结果能清楚地显示在电脑屏幕上。二程序流程图三程序代码练习一:DATA SEGMENTA DB 90B DB -70C DB 5Y DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV BL,A MOV CL,B ADD BL,CL ;A+B MOV AL,02H IMUL BL ;2*(A+B) MOV BX,AX MOV AL,A MOV

10、 CL,C IMUL CL ;A*C IDIV CL ;A*C/5 ADD AX,BX MOV Y,AX MOV AH,4CH INT 21HCODE ENDS END START练习二:DATA SEGMENTA DW 15786DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV BX,A MOV CX,16LEFT: TEST BX,8000H JNZ L1 ;当首位为1,执行L1 MOV DL,0 ;输出0 MOV AH,02H INT 21HSHL: SHL BX,1 LOOP LEFT

11、 MOV AX,4CH INT 21HL1: MOV DL,1 ;输出1 MOV AH,02H INT 21H JMP SHLCODE ENDS END START运营结果:练习三:DATA SEGMENTSUM DW ?HEHE DB ?,?,?,?,?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX LEA SI,HEHE MOV BL,0 MOV CX,5LOOP1: MOV AH,01H INT 21H SUB AL,30H MOV SI,AL INC SI LOOP LOOP1 MOV CX

12、,5 MOV AX,0 SUB SI,5LOOP2: ADD AL,SI AAA INC SI LOOP LOOP2 MOV BX,AX MOV SUM,AX MOV DL,BH ADD DL,30H MOV AH,2 INT 21H MOV DL,BL ADD DL,30H MOV AH,2 INT 21H MOV AH,4CH INT 21HCODE ENDS END START运营结果:冒泡排序法程序:DATAS SEGMENTSHURU DB QING SHU RU 5 GE SHU JU,13,10,$SHU1 DB 4,?,3 DUP(?)SHU2 DB 4,?,3 DUP(?)S

13、HU3 DB 4,?,3 DUP(?)SHU4 DB 4,?,3 DUP(?)SHU5 DB 4,?,3 DUP(?)AVER DB 3 DUP(?)SHUCHU DB PAI XU HOU DE SHU JU SHUN XU SHI,:,$MAX DB ZUI DA ZHI SHI,:,$MIN DB ZUI XIAO ZHI SHI,:,$AVERAGE DB PING JUN ZHI SHI,:,$CHUSHU DB 100,10HE DW ?STR1 DB 16 DUP(30H)STR2 DB PING JUN ZHI DE ER JIN ZHI CHUAN SHU CHU,:,$DA

14、TAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX MOV ES,AX LEA DX,SHURU;显示QING SHU RU 5 GE SHU JU: MOV AH,9 INT 21H MOV CX,5;输入五个数字 MOV SI,0INPUT: LEA DX,SHU1+SI;输入要排序的原始数据 MOV AH,10 INT 21H MOV DL,10;输入后换行 MOV AH,2 INT 21H ADD SI,5;指针加5,指向下一个变量 LOOP INPUT CLD MOV CX,4;设定排

15、序外循环次数A: MOV BP,0 PUSH CX;外循环次数入栈PX: PUSH CX MOV CX,3 LEA SI,SHU1+BP+2;逐位比较两个数大小 LEA DI,SHU1+BP+7 REPZ CMPSB JB B;假如小于直接比较下一个数,否则两个数对换位置 MOV CX,3Jh: MOV AL,SHU1BP+2 XCHG AL,SHU1BP+7;将两个字节对换位置,循环3次即完毕这两个数的互换 XCHG AL,SHU1BP+2 INC BP LOOP Jh SUB BP,3B: ADD BP,5;指向后面两个数字 POP CX LOOP PX POP CX;外循环次数出栈 LO

16、OP A LEA DX,SHUCHU;输出字符串PAI XU HOU DE SHU JU SHUN XU SHI: MOV AH,9 INT 21H MOV CX,5 MOV SI,2OUTPUT:PUSH CX;计数器入栈实现循环嵌套 MOV CX,3L: MOV AL,SHU1+SI;输出排序后的5个数字 MOV DL,AL MOV AH,2 INT 21H INC SI LOOP L MOV DL,2CH MOV AH,2 INT 21H ADD SI,2 POP CX;计数器出栈 LOOP OUTPUT MOV DL,10 MOV AH,2 INT 21H MOV DL,0DH MOV

17、 AH,2 INT 21H LEA DX,MAX;输出字符串ZUI DA ZHI SHI: MOV AH,9 INT 21H MOV CX,3 MOV SI,2 D: MOV DL,SHU5+SI;输出最大值 MOV AH,2 INT 21H INC SI LOOP D MOV DL,10;换行 MOV AH,2INT 21H MOV DL,0DH MOV AH,2 INT 21H LEA DX,MIN;输出字符串ZUI XIAO ZHI SHI: MOV AH,9 INT 21H MOV CX,3 MOV SI,2 E: MOV DL,SHU1+SI;输出最小值 MOV AH,2 INT 2

18、1H INC SI LOOP E MOV DL,10 MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H LEA DX,AVERAGE;输出字符串PING JUN ZHI SHI: MOV AH,9 INT 21H MOV CX,3 MOV BX,10;除数10 MOV SI,2 AD: MOV DX,0 MOV AH,0 PUSH CX MOV CX,3 ZH: MOV AL,SHU2+SI;将十进制数转换为二进制数,为后面求平均值做准备 SUB AL,30H PUSH AX MOV AX,DX MUL BX MOV DX,AX POP AX ADD D

19、X,AX INC SI LOOP ZH;执行3次完毕3个十进制数的转换 ADD SI,2 POP CX ADD HE,DX;将DX的数放在HE中 LOOP AD;循环后得到三个十进制数转换为二进制数之后的相加和 MOV DX,HE; MOV AX,DX XOR DX,DX MOV BX,3 DIV BX;除3取平均值,结果将商放在AX中,余数放在DX中 MOV BX,AX;给BX赋值平均数,然后将BX中表达的十进制数转换为相应的字符串 DIV CHUSHU;除100取最高位 ADD AL,30H;转换为ASCII码 MOV AVER,AL MOV AL,AH XOR AH,AH DIV CHU

20、SHU+1;除10取十位 ADD AL,30H ADD AH,30H;余数就是个位 MOV AVER+1,AL MOV AVER+2,AH MOV CX,3 MOV SI,0 F: MOV DL,AVER+SI;输出平均值 MOV AH,2 INT 21H INC SI LOOP F MOV DL,10 MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H LEA DX,STR2 ;输出字符串PING JUN ZHI DE ER JIN ZHI CHUAN SHU CHU: MOV AH,9INT 21H MOV CX,16 MOV SI,0 G: RCL

21、BX,1;将平均数转换为二进制串 JNC H ADD STR1+SI,1;假如不为0就将其加1变成1的ASCII码值 H: MOV DL,STR1+SI;将二进制串逐个输出 MOV AH,2 INT 21H INC SI LOOP G MOV AH,4CH INT 21HCODES ENDS END START运营结果:四 实验感想和收获 本次实验相较于第一次难度增大了很多,本人花了大约12个小时才做完。第一个练习很简朴,从编译到连接都是一次通过,在用DEBUG调试发现结果却实对的。但是在做第二个练习时我碰到了困难,完全没有思绪。当时不知道怎么对一位一位的数据进行操作,在看书的过程中无意中发现

22、了循环指令,我才意识到用SHL指令可以实现这个功能。第三个联系重要考察我们对中断指令的了解限度,我实现地是一位数的加法,但是后来老师发给了我们他自己编的版本,我感慨道编程真是一门大学问,要考虑到各种各样的功能,人机互动,也许犯错的地方。这都是需要大量的实践积累才行。在编写冒泡排序法这个程序时我碰到了很多困难。起初在编写一段循环指令时,未把寄存器CX入宅,所以影响了其他部分的循环次数,导致结果犯错。所以此后编程时一定要把有用的信息入宅,防止被其他指令所改变。在输出字符时,必须记得把要输出字符的值转变成ASCI码,我期初输出数字时就忘掉了这一步导致出了很多差错。同时在将二进制数转变成BCD吗输出时

23、可以通过除10来实现,将得到的商继续除10,而得到的余数就是个位的值,同理,再次除10得到的余数就是10位。所以通过适当此处的出发可以将二进制数转变为BCD码。通过亲身实践这次实验,对汇编语言编程有了初步的结识,也体会到了编程的整个过程。从读题,设计程序框架到写代码,步步承接,同时将课堂上所学的知识运用起来,在加深理解的同时也发现了自己很多不懂的地方,于是通过自己查资料,问老师终于将程序一步步地调试对的得出盼望的结果,那种自豪和满足感油然而生。 第三次实验 8253定期器/计数器与接口实验 乐曲程序 一功能说明计算机是如何产生音乐和声响的呢?本来在计算机中有一个可编程时间间隔定期器8253,它

24、能根据程序提供的计数值和工作模式,产生各种形状和各种频率的计数/定期脉冲,提供应系统的各个部件使用。它还可以产生不同频率的脉冲作为扬声器的声源。在8253定期器内部有3个独立工作的计数器:Counter0, Counter1, Countre2,每个计数器都分派有一个端口地址,分别是40H,41H,42H。8253内部尚有一个公用的控制寄存器,端口地址为43H,端口地址输入到8253的CS,A1,A0端,分别对三个计数器和控制器寻址。对8253编程时,先要设定控制字,以选择计数器,拟定工作模式和计数值的格式,每个计数器由三个引脚与外部联系,CLK为时钟输入端,GATA为门控制信号输入端,OUT

25、为计数/定期信号输入端。每个计数器是以倒计数的方式计数,也就是说,从计数初值开始逐次减1,直到减为0为止。端口地址与计数器的关系:40H选中计数器0:作为定期器为系统日时钟提供计时基准41H选中计数器1:作为定期器使用42H选中计数器2:用来控制扬声器发声43H公用的控制器:分别对三个寄存器和控制器寻址那么,如何触动扬声器发出声音呢?本来PC机的主音箱上装有一只小喇叭,由定期器8253和并行接口芯片8255(可编程外围接口芯片)控制其发声,8255涉及三个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分派的I/O端口地址为60H和62H,输出寄存器分派的I/O端口地址为61H。82

26、53定期器计数器2连接到扬声器,其电路如下: 8253 DRIVER 1.9318MHZ CLK 喇叭与门门22门1门 OUT2 8255 PB0 GATE2 PB1 装入计数器2的计数初值为533H(1.19318MHz/896Hz=1331=533H),这样,得到的控制字为10110110B=0B6H,即选中计数器2,读/写,工作方式三(方波发声器),二进制。计数器2的初始化程序为: MOV AL,0B6H OUT 43H,AL 1) 计算计数值程序段:MOV DI, 给定频率 MOV DX, 12HMOV AX, 34DCHDIV DIAX中即为计数值。2) 打开扬声器发声,8255PB

27、0,PBI送出高电平:IN AL , 61HOR AL , 3OUT 61H , AL3)关闭扬声器,停止发声:IN AL ,61HAND AL , 0FCHOUT 61H, AL 两只老虎的音频表定义在数据段中,如下:STACK SEGMENT DW 100 DUP(?)STACK ENDSDATA SEGMENTMUSIC DW 2 DUP(262,294,330,262) ; 频率表,1231;1231 DW 2 DUP(330,349,392) ;345;345; DW 2 DUP(392,440,392,349,330,262) ;565431;565431 dw 2 dup(294

28、,196,262),0 ;251;251,0表达结束 TIME DW 10 DUP(250*50),500*50,250*50,250*50,500*50 ;节拍表 DW 2 DUP(120*50,120*50,120*50,120*50,250*50,250*50) DW 2 DUP(250*50,250*50,500*50)N EQU 32 ;32个音符DATA ENDS二实验目的: 学习8253计数器2输出方波信号用以驱动扬声器发声的原理,通过程序设立计数器2的输出波形的频率和延续时间,控制扬声器的音调和发生长短。三.实验内容:1.设计程序让微机演奏一段两只老虎的乐曲。2.思考如何让PC

29、机演奏一遍,两遍以及数遍这段两只老虎的乐曲,并修改程序实现。四.实验报告:整理出运营对的的源程序清单(加以中文注释),并给出具体程序流程图。三程序代码DATAS SEGMENTBG DB 0AH,0DH,”TWO TIGER:$” FREQ DW 2 DUP(262,294,330,262) DW 2 DUP(330,349,392) DW 2 DUP(392,440,392,349,330,262) DW 2 DUP(294,196,262),0 ;频率表TIME DW 10 DUP(250*50),500*50,250*50,250*50,500*50 DW 2 DUP(120*50,12

30、0*50,120*50,120*50,250*50,250*50) DW 2 DUP(250*50,250*50,500*50) NUM DB 3DATAS ENDSSTACK SEGMENT PARA STACK STACK DB 200 DUP(?) ;堆栈段定义并分派存储空间STACK ENDS ASSUME CS:CODE,DS:DATA,SS:STACKSTAT PROC FAR PUSH DS ;DS中包含的是程序段前缀的起始地址 MOV AX,0 PUSH AX MOV AX ,DATA MOV DS,AX MOV DX,OFFSET BG MOV AH,09 INT 21H ;

31、 输出字符串“TWO TIGER”LP0: MOV SI,OFFSET FREQ MOV BP,OFFSET TIME CALL SING ;调用子程序,开始演奏 DEC NUM CMP NUM,0 JNZ LP0 RETSTAT ENDPSING PROC NEAR ;演奏子程序 PUSH DI PUSH SI PUSH BP PUSH BXREPTO: MOV DI,SI ;DI指向频率表首地址 CMP DI,0 JE END_SING 若DI=0,则演奏结束 MOV BX,DS:BP CALL SOUND ADD SI,2 ADD BP,2 JMP REPTOEND_SING:POP B

32、X ;扬声器发声子程序 POP BP POP SI POP DI RETSING ENDPSOUND PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL,0B6H ;开始计算计数值 OUT 43H,AL MOV DX,12H MOV AX 34DCH DIV DI OUT 42H,AL MOV AL,AH OUT 42H,AL IN AL,61H ;打开扬声器发声 MOV AH,AL OR AL,3 OUT 61H,AL DELAY: MOV CX,20230 ;延时10MS DL 10MS:LOOP DL10MS DEC BX J

33、NZ DELAY MOV AL,AH OUT 61H,AL ;关闭扬声器 POP DI POP DX POP CX POP BX POP AX RETSOUND ENDPCODE ENDS END STAT 四实验感想和收获 这个程序最初一直存在输出乱码的情况,后来通过单步调试,发现是通用子程序时没有进行现场的保护,几个存储器被多次赋值,导致最后不能输出对的的结果。因此我之后增长了堆栈段的定义,对几个寄存器进行了入栈保护,对子程序的调用进行了现场保护。计数器2的计数初值为533H,控制字为10110110B=0B6H,这个控制字牢记不能搞错,同时也要清楚地区分各个计数器的端口地址以及控制口的端

34、口地址。在播放音乐的子程序中,应当将数值传到端口42H,打开扬声器,延时,关闭扬声器的顺序执行,最初我在编程时漏掉了延时的过程,导致无法得到对的的结果。此外,在SOUND子程序末尾一定要记住返回中断点,由于这是一个循环,不是只出现一个音符,而是要一直播放整个音乐。通过这个实验,我对子程序调用,堆栈段使用有了更深的理解,通过自己编译,调试,一步步找到自己的局限性,这是一个学习的过程,也是对知识的探求。这次实验老师给了我们很多的资料和一些源代码,我要做的不仅是将他们拼接起来,是要根据自己的设计对他们加以运用,并补充很多的子程序,现场保护代码等,将其完善,变为自己的程序。子程序调用必须先进行现场保护,这是非常重要的,也是汇编语言和高级语言一大不同所决定的。编程需要耐心和决心,只有一步步检查,才干使程序对的,达成想要的结果,正由于这样,当程序编译成功,电脑开始播放音乐时,那种成功地满足感不是用语言形容的,这让我对这门课程有了更多地爱好。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!