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

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

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

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

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

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

 

《微机原理与接口技术实验报告》

 

学院:

电气信息学院

班级:

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通过电脑发声,了解了其编程过程,学到了很多新的知识。

我理解了汇编语言中编程的基本步骤,掌握了通过地址对数据赋值的方法。

掌握芯片的使用方法,了解了计算机编程过程中的相关知识。

特别是能够是主板发出声音,我觉得很有成就感,自己编的小调尽管十分粗糙,我还是从中得到了快乐。

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

当前位置:首页 > 表格模板 > 表格类模板

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

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