四川大学微机原理实验报告_第1页
四川大学微机原理实验报告_第2页
四川大学微机原理实验报告_第3页
四川大学微机原理实验报告_第4页
四川大学微机原理实验报告_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、正确可使用 DEBUG勺设置断点,单步执行等功能发现错误所在并加以改正。.程序流程图: 结束三.程序代码修改后的程序代码如下:DATA SEGMENTA DB 9,6,8,7,5B DB 5C DB 5 DUP (0)N EQU 5DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AX CLDLEA SI,ALEA DI,CMOV CX,NMOV AH,0 LP1: LODSBAADDIV BSTOSBLOOP LP1MOV CX,NLEA DI,CLP2: MOV DL,D

3、IADD DL,30HMOV AH,2INT 21HINC DILOOP LP2MOV AH,4CHINT 21H CODE ENDS END START四.实验感想和收获通过这次试验,我对微机原理上级试验环境有了初步的认识, 可以较为熟练 地对汇编语言进行编译,汇编及连接, 同时也学会了用DEBU调试程序,收获很 大。在这次试验中我也遇到了一些困难。在刚开始我发现自己无法打开 MASM.EXE计算机提示是由于版本不兼容。我这才想起来我的操作系统是64位的,和该软件版本不兼容。不过我并没有放弃,经过我的摸索之后,我发现用 DOSBOXi个程序可以解决我的电脑运行不了该程序的问题。在解决了第一个

4、难 题后,我开始着手改正试验1.3中的语法错误和逻辑错误,但是无论我怎么修改 却始终都无法通过编译,并且基本上每句话都有编译错误。根据我多年编程的经 验来看,这应该是中文输入法在搞鬼,之后我耐心地把程序重新输了一遍, 果然 通过了编译,并且之后的连接也进行的很顺利。 在用DEBUGI试时发现得出的结 果也很正确。尽管这次的实验内容非常简单,仅仅是教会我们一些基本的操作,但我却明 显感觉到了汇编语言和 C语言等高级语言所不同的地方。 越是底层,基础的东西 就越不人性化,用C语言一行代码就能实验的功能在汇编语言中可能要花上数十 行。看来汇编语言的学习不是几周就能速成的,必须要有长年累月的积淀才能掌

5、握。实验二设计汇编语言程序一.功能说明练习1.实验题目:编程计算下列表达式:A=90, B=-70, C=5, Y均为有符号数,计算 Y=2X ( A+B +(AXC)+5要编写一些稍微复杂的程序,我们会遇到一段程序被反复执行,这样,我们会用到LOOP指令。使用该指令时,需在CX中装入循环次数。练习2.码转换程序设计 编制程序,把十进制数 15786转化成二进制数。提示:15786=1 X 10X 10X 10X 10+5X103+7X 102+8X 10+6,循环 CX=5练习3.编制程序,从键盘输入最多5个数,求他们的和,存入 SUM练习4.用“冒泡“法对一组数 300, 250, 280

6、, 240, 260,按从小到大的顺序排列。提示:用冒泡的方法对一组数据元素排序,它的基本方法是:将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。对于5 (ND个元素,整个排序通过4遍(=N-1)邻元素排序完成。每一遍的排序由若干次邻元素的排序组成。4遍排序中,邻元素的排序依次为4, 3, 2, 1遍。完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。外循环的次数为 CX=4次(N-1),内循环的次数为 4, 3, 2, 1(DEC CX)排序遍数本遍排序前第一次排序 后第二次排序 后第三次排序 后第四次排序 后1300, 250

7、240, 260,280,250, 300, 280,240, 260250, 280, 300,240, 260250, 280, 240J300, 260250, 280, 240,260, 3002250, 280,240,250, 280, 240,250, 240, 280,250, 240, 260,260|, 300260, 300260, 300280, 3003250, 240,260,250, 240, 260,240, 250, 260,280, 300280, 300280, 3004240, 250280, 300,260,240, 250, 260,280, 300

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

9、均值以二进制串的形式输出。7 .设计程序要有模块化的思想,用子程序实现不同的功能;所有数据输出前要用字符串的输出指令,进行输出提示(如: zui da zhi shi : 300等),所有数据结果能清晰地显示在电脑屏幕上。.程序流程图输出排序后的五个数据输出ZUI DA ZHI SHIJ 输出第5个数 即最大值J输出ZUI XIAO ZHI SHI输出第1个数 即最小值输出,PING工HE=0 /$/ CX=37IX指针指向第二个数一将其由ASC码“转成2进制数-J1指针指向he=he+下一个数二进制数CX 1AINY将平均值按位 转换iASCI 逐个输出*输出PINGJUN ZHI DE E

10、R JIN ZHI CHUAN SHU CH U,i ,/设量X=16SI=0数据段设.置变:8TR1 DB/16 DUP(30H)将平均值(二 进制)带进位 左移一位Jx.,Y三.程序代码练习一:DATA SEGMENTA DB 90B DB -70C DB 5Y DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV BL,AMOV CL,BADD BL,CL; A+BMOV AL,02HIMUL BL;2*(A+B)MOV BX,AXMOV AL,AMOV CL,CIMUL CL;A*CI

11、DIV CL;A*C/5ADD AX,BXMOV Y,AXMOV AH,4CHINT 21HCODE ENDSEND START蹈 LJUBom UJ4 Cpu 5 peed:iJUW cycles, h ram eskip U, Program:=X=005ABX=0GE8CX=0OG5DX=0Q00SF=0Q00BF=000O SI =000。 DI=H900)S=076AES=675ASS=G76SCS=676BIP=0C03 OU UP El PL HZ AC FE CY37BB:QQG Q3C3ADD AX.BX-tX=Qefl2 BXGQZBS=G76A ES=675ACX=0ee

12、& DX;OGQQ SP=QGa3SS=0(769 CS=G76B IP=OGEZ376B:0QE2 A30300MUULOOGSJ.AXBPGQOQ ST=QQGO DI=GQ0eMU UP EI PL NZ AC PE NCDS:0003=0000X=OGGZ BX=00ZBS=G76门 ES=G75ACX=00G)5 DX=0O0O 5P=0O0OSS=G769 CS=G76B IF=0025BP=GO00 31=0000 DIGOQONU UF EI FL NZ AC PE NC68:0025 ds:O0OO人 ErrorB44cMOUAH.4Cd ds:O 7&AIOOOO6A:00

13、106A: 00(2076AiO03O6A:0O40 ?6A:005O 7BA:0O6G6A :00?OGFB3 附loloko GeA。 科科 63iB6FCOI0IO0I RBlel3N9)0旧105B 一 GQ0OO0O 00 00 00-00 D8 8A IE 00-00 D8 AG 00 00-6A 09 B4 4C CD-21 00 0G 06 00-00 00 00 00 00-00 OO 00 00 QO-GQ 00 00 00 00-00L练习二:DATA SEGMENTA DW 15786DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA

14、START: MOV AX,DATAMOV DS,AXMOV BX,AMOV CX,16LEFT: TEST BX,8000HJNZ L1;当首位为1,执行L1MOV DL,0;输出0MOV AH,02HINT 21HSHL: SHL BX,1LOOP LEFTMOV AX,4CHINT 21HL1: MOV DL,1;输出1MOV AH,02HINT 21HJMP SHLCODE ENDSEND START运行结果:练习三:DATA SEGMENT SUM DW ?HEHE DB ?,?,?,?,?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA STA

15、RT: MOV AX,DATAMOV DS,AX LEA SI,HEHE MOV BL,0 MOV CX,5 LOOP1: MOV AH,01HINT 21HSUB AL,30H MOV SI,AL INC SILOOP LOOP1MOV CX,5MOV AX,0SUB SI,5LOOP2: ADD AL,SIAAAINC SILOOP LOOP2MOV BX,AX MOV SUM,AXMOV DL,BHADD DL,30H MOV AH,2 INT 21HMOV DL,BLADD DL,30HMOV AH,2 INT 21HMOV AH,4CHINT 21H CODE ENDSEND STA

16、RT运行结果:For fflorc inf ormat ion read the HEfiDflE f i le in the D(13Box dl irectory.HAUE FUN*The DOSBox Team http : zzuiwlj. dosbox B comZ:XSET BLASTER=A2Z0 I? DI H5 T6名二、Amnirnt. e e : xusrkst-iiiidyZincim E i s nKiuvkltd as ua 1 d ifec: ttiryXuuikludyZnKiinsIll ega 1 comma nd : sh LgaiiZZ . exe .Z

17、:Se.E-XshiqanZZ.exeOOI111011D1O1010EXshiyanZ3.exe1Z34515E2_冒泡排序法程序:DATAS SEGMENTSHURU DB QING SHU RU 5 GE SHU JU,13,10,$SHU1 DB 4,?,3 DUPSHU2 DB 4,?,3 DUPSHU3 DB 4,?,3 DUPSHU4 DB 4,?,3 DUPSHU5 DB 4,?,3 DUPAVER DB 3 DUPSHUCHU DB PAI XU HOU DE SHU JU SHUN XU SHI,:,$MAX DB ZUI DA ZHI SHI,:,$ MIN DB ZUI

18、 XIAO ZHI SHI,:,$ AVERAGE DB PING JUN ZHI SHI,:,$ CHUSHU DB 100,10 HE DW ?STR1 DB 16 DUP(30H)STR2 DB PING JUN ZHI DE ER JIN ZHI CHUAN SHU CHU,:,$ DATAS ENDS CODES SEGMENTASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX MOV ES,AX LEA DX,SHURU; 显示 QING SHU RU 5 GE SHU JUMOV AH,9INT 21HMOV CX,5;输入

19、五个数字MOV SI,0INPUT: LEA DX,SHU1+SI;输入要排序的原始数据MOV AH,10INT 21HMOV DL,10;输入后换行MOV AH,2INT 21HADD SI,5; 指针加5,指向下一个变量LOOP INPUTCLDMOV CX,4;设定排序外循环次数A: MOV BP,0PUSH CX;外循环次数入栈PX: PUSH CXMOV CX,3LEA SI,SHU1+BP+2;逐位比较两个数大小LEA DI,SHU1+BP+7REPZ CMPSBJB B;如果小于直接比较下一个数,否则两个数对换位置MOV CX,3Jh: MOV AL,SHU1BP+2XCHG A

20、L,SHU1BP+7;将两个字节对换位置,循环3次即完成这两个数的 交换XCHG AL,SHU1BP+2INC BPLOOP JhSUB BP,3B: ADD BP,5;指向后面两个数字POP CXLOOP PXPOP CX;外循环次数出栈LOOP ALEA DX,SHUCHU;输出字符串PAI XU HOU DE SHU JU SHUN XU SHI MOV AH,9INT 21HMOV CX,5MOV SI,2OUTPUT:PUSH C迎数器入栈实现循环嵌套MOV CX,3L: MOV AL,SHU1+SI; 输出排序后的5个数字MOV DL,ALMOV AH,2INT 21HINC SI

21、LOOP LMOV DL,2CHMOV AH,2INT 21HADD SI,2POP CX; 计数器出栈LOOP OUTPUTMOV DL,10MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,MAX; 输出字符串ZUI DA ZHI SHI :MOV AH,9INT 21HMOV CX,3MOV SI,2D: MOV DL,SHU5+SI;输出最大值MOV AH,2INT 21HINC SILOOP DMOV DL,10;换行MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,MIN;输出字符串ZUI XI

22、AO ZHI SHI :MOV AH,9INT 21HMOV CX,3MOV SI,2E: MOV DL,SHU1+SI;输出最小值MOV AH,2INT 21HINC SILOOP EMOV DL,10MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,AVERAGE;输出字符串PING JUN ZHI SHI :MOV AH,9INT 21HMOV CX,3MOV BX,10;除数 10MOV SI,2AD: MOV DX,0MOV AH,0PUSH CXMOV CX,3ZH: MOV AL,SHU2+SI;将十进制数转换为二进制数,为后面求平均值

23、做准备SUB AL,30HPUSH AXMOV AX,DXMUL BXMOV DX,AXPOP AXADD DX,AXINC SILOOP ZH;执行3次完成3个十进制数的转换ADD SI,2POP CXADD HE,DX; 将DX的数放在HE中LOOP AD;循环后得到三个十进制数转换为二进制数之后的相加和MOV DX,HE;MOV AX,DXXOR DX,DXMOV BX,3DIV BX;除3取平均值,结果将商放在AX中,余数放在DX中MOV BX,AX;给BX赋值平均数,然后将BX中表示的十进制数转换为对应 的字符串DIV CHUSHU; 除100取最高位ADD AL,30H; 转换为

24、ASCII 码MOV AVER,ALMOV AL,AHXOR AH,AHDIV CHUSHU+1; 除 10 取十位ADD AL,30HADD AH,30H;余数就是个位MOV AVER+1,ALMOV AVER+2,AHMOV CX,3MOV SI,0F: MOV DL,AVER+SI;输出平均值MOV AH,2INT 21HINC SILOOP FMOV DL,10MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEADX,STR2;输出字符串PING JUNZHI DEERJIN ZHI CHUAISHUCHUMOV AH,9INT 21HMOV CX,1

25、6MOV SI,0G: RCL BX,1;将平均数转换为二进制用JNC HADD STR1+SI,1;如果不为0就将其加1变成1的ASCII码值H: MOV DL,STR1+SI;将二进制用逐个输出MOV AH,2INT 21HINC SILOOP GMOV AH,4CHINT 21HCODES ENDSEND START运行结果:四.实验感想和收获本次实验相较于第一次难度增大了很多,本人花了大约12个小时才做完。第一个练习很简单,从编译到连接都是一次通过,在用DEBU蜩试发现结果却实 正确。不过在做第二个练习时我遇到了困难,完全没有思路。当时不知道怎么对一位一位的数据进行操作,在看书的过程中

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

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

28、机中有一个可编程时间问隔 定时器8253,它能根据程序提供的计数值和工作模式,产生各种形状和各种频 率的计数/定时脉冲,提供给系统的各个部件使用。它还可以产生不同频率的脉 冲作为扬声器的声源。在8253定时器内部有3个独立工作的计数器:Counter。, Counted,Countre2,每个计数器都分配有一个端口地址,分别是40H, 41H, 42Ho 8253内 部还有一个公用的控制寄存器,端口地址为 43H,端口地址输入到8253的CS A1, A0端,分别对三个计数器和控制器寻址。对8253编程时,先要设定控制字,以选择计数器,确定工作模式和计数值的 格式,每个计数器由三个引脚与外部联

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

30、地址为60H和62H,输出寄存器分配的I/O端口地址为61Ho 8253定时器计数器2连接到扬声器,其电路如下:8253 DRIVER喇叭装入计数器 2的计数初值为 533H (1.19318MHz/896Hz=1331=533H,这样, 得到的控制字为10110110B=0B6H即选中计数器2,读/写,工作方式三(方波 发声器),二进制。计数器2的初始化程序为:MOV AL,0B6HOUT 43H,AL1)计算计数值程序段:MOV DI ,给定频率MOV DX, 12HMOV AX, 34DCHDIV DIAX中即为计数值。2)打开扬声器发声,8255PB0 PBI送出高电平:IN AL ,

31、 61HOR AL , 3OUT 61H , AL3)关闭扬声器,停止发声:IN AL , 61HAND AL , 0FCHOUT 61H , AL两只老虎的音频表定义在数据段中,如下:STACK SEGMENTDW 100 DUPSTACK ENDSDATA SEGMENTMUSIC DW2 DUP(262,294,330,262);频率表,1231;1231DW 2 DUP(330,349,392);345;345;DW 2 DUP(392,440,392,349,330,262);565431;565431dw 2 dup(294,196,262),0;251;251,0表示结束TIME

32、 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的输出波形的频率和延续时间,控制扬声器的音调和发生长短。3 .实验内容:1 .设计程序让微机演奏一段两只老虎的乐曲。2 .思考如何让PC机演奏一遍,两遍以及数遍这段两只老虎的乐曲,并修改 程序实现

33、。4 .实验报告:整理出运行正确的源程序清单(加以中文注释),并给出详细程序流程图。三.程序代码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*50DW 2 DUP(120*50,120*50,120*50,120*50,250*50,250*50)D

34、W 2 DUP(250*50,250*50,500*50)NUM DB 3DATAS ENDSSTACK SEGMENT PARA STACK STACKDB 200 DUP(?);堆栈段定义并分配存储空间STACK ENDSASSUME CS:CODE,DS:DATA,SS:STACKSTAT PROC FARPUSH DS; DS中包含的是程序段前缀的起始地址MOV AX,0PUSH AXMOV AX ,DATAMOV DS,AXMOV DX,OFFSET BGMOV AH,09INT 21H;输出字符串 “ TWO TIGERLP0: MOV SI,OFFSET FREQMOV BP,OFFSET TIMECALL SING;调用子程序,开始演奏DEC NUMCMP NUM,0JNZ LP0RETSTAT ENDPSING PROC NEARPU

温馨提示

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

评论

0/150

提交评论