四川大学微机原理实验报告.docx

上传人:b****4 文档编号:24789919 上传时间:2023-06-01 格式:DOCX 页数:29 大小:196.11KB
下载 相关 举报
四川大学微机原理实验报告.docx_第1页
第1页 / 共29页
四川大学微机原理实验报告.docx_第2页
第2页 / 共29页
四川大学微机原理实验报告.docx_第3页
第3页 / 共29页
四川大学微机原理实验报告.docx_第4页
第4页 / 共29页
四川大学微机原理实验报告.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

四川大学微机原理实验报告.docx

《四川大学微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《四川大学微机原理实验报告.docx(29页珍藏版)》请在冰豆网上搜索。

四川大学微机原理实验报告.docx

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

 

微机原理试验汇报

 

学院:

专业班级:

姓名

学号

 

试验一汇编语言编程基础

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;频率表

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1