微机原理实验报告.docx

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

微机原理实验报告.docx

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

微机原理实验报告.docx

微机原理实验报告

华北电力大学

科技学院

课程名称:

微机原理实验

******

**************

班级:

电气11k6

学号:

************

实验一数据转换实验

一、实验目的

(1)初步掌握在PC机上建立、汇编、链接和运行8086/88汇编语言程序的过程。

(2)通过对两个验证性试验的阅读、调试、掌握不同进制数及编码相互转换的程序设计方法。

(3)完成程序设计题,加深对数码转换的理解,了解简单程序设计方法。

二、实验内容

1.十六进制数转换为ASCII码

设二字节十六进制数存放于其实地址为3500H的内存单元中,把他们转换成ASCII码后,再分别存入起始地址为350A的四个内存单元中。

从书上ASCII码表中可知十六进制数加30H即可得到0H~9H的ASCII码,而要得到AH~FH的ASCII码,则需再加7H。

请根据所给流程图理清思路,总结出对应的若干要点。

将流程图与参考程序相互。

根据分析的结果将运行时内存的变化列写出来。

学习并使用MASM或WAVE仿真软件分析程序运行过程中相关寄存器及相应内存的变化情况来验证自己的猜想,以巩固命令的学习,提高编程能力。

1.1程序流程图

1.2实验程序

DATASSEGMENT

;此处输入数据段代码

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

;此处输入代码段代码

MOVCX,0004H;根据转换个数设定循环次数

;(两字节十六进制数如6B2C对应有四个用十六进制表示的ASCII码表示,即四个字节)

MOVDI,3500H;指向该两字节十六进制数起始地址,此时在调试窗口修改内存字节

MOVDX,[DI];将地址3500H中的内容(6B2C)给DX

A1:

MOVAX,DX;第一次时DX=6B2C,

;因为想顺序取C、2、6、B,所以需要一个中间变量

ANDAX,000FH;取低四位,第一次取到C,

CMPAL,0AH;判断AL属于0~9,还是A~F

JBA2;如果是0~9,则跳转到A2

ADDAL,07H;若属于A~F,再加上07H后也是再加上30H即得到转换。

A2:

ADDAL,30H;0~9的ASCII码对应的十六进制比其

;本身(注意:

亦是十六进制)大30H

MOV[DI+0AH],AL;将转码后的C,即43H给350A

INCDI;将DI指向下一字节,用于存储转码后的值,第一次自增后要存‘2’

PUSHCX;功能是接下来要用到CX作为一个中间变量,

;而刚才已经使用并且接下来还会用到CX的值,

;也可以不用CX,用其他不用的寄存器或者直接立即数形式的。

MOVCL,04H;若直接用立即数,可能不稳定,(原因不详)用一个中间变量。

SHRDX,CL;右移四位,如第一次转码后,DX=6B2C,

;为下一次取低四位的2做好前提,将0010b移到低四位

POPCX;执行完后,CX又用于计数

LOOPA1;每一次转码后,执行完此句后,CX的值都要变化,

;分别是3,2,1,0;正好四次。

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

1.3实验过程与心得

1.3.1编程要点

1.数据在内存空间中的存储情况要清晰;

图1-1-2图1-1-3

如上图所示图1-2为处理前的存储情况,通过调试中的内存修改来实现并检查,图1-3为最后期待的转码结果,通过查询内存来检查。

2.基本功能的实现:

分两种情况去转码。

中间涉及到比较选择语句,可以通过标志位来理解学习JB的实现条件是由于标志位的变化。

3.取与存两个“指针”的变化

(1)取时通过一个中间变量取经过右移四位后的低字节来依次选择C、2、B、6;使用软件时,看AX经过“ANDAX,000FH”后是否取到了这些数。

(2)每一次转码后存储时将指针在存储空间305A不断移动。

每次存储后,可查询内存。

(3)每一次循环过后,CX都要变化,也可同时学习PUSH、POP功能。

1.3.2软件使用简介

1.WAVE软件

它可以将内存的变化及寄存器的变化实时展示出来,红色数据是新变化的值。

查找内存时可通过右键转到地址即可,但需要输入物理地址。

如此时偏移地址为3500H,而通过观察DI赋值前一状态ds为20H,则通过计算可知在3700H输入2C,3701H输入6B即可,双击修改。

可以与硬件连接做接口实验,但没有人机对话功能。

在使用之前需要建立新项目。

过程简介如下:

选择8086仿真--右击模块文件--新建项目--假如已编ASM文件(最好一个文件夹中)--保存项目--全部编译--单步执行(F8)--观查内存变化。

2.MASM软件

它可以通过DEBUG调试窗口来进行观察,但需要有不同的命令输入去修改内存,查询内存,并且更新情况也不如WAVE直白,若有其他未考虑的某值变化,不宜观测。

单步跟踪(“t”)是先执行上一条语句,并显示执行后的状态,即显示上一语句执行后的状态。

而末尾的命令语句还未执行。

它不需要计算物理地址。

如找3500H时,直接输入“dds:

3500”即可查询。

另外,标志位的查询尽管每次单步跟踪都显示,但是需要先记住各个符号代表的意思。

修改内存较WAVE繁琐,需要输入e3500,然后会提示修改,但一次只能改一个字节的内容。

其余命令可以在左侧DEBUG调试里双击在右侧得到。

另外,状态的显示没有记录。

MASM有人机对话功能,但在使用时,无法调试查看内存变化。

过程简介:

编程--保存(.asm)--编译成目标文件--生成可执行文件--DEBUG调试。

1.3.3使用过程

1.将二字节十六进制数存放于起始地址为3500H的内存单元中

图1-1-4

 

2.查看内存的变化--注意DX的变化

图1-1-5

3.

(1)注意AX的变化,已取低四位

(2)标志位的变化:

0CH比0AH大,NC表示CF=0,不执行JB后的命令,即继续执行+07H。

图1-1-6

 

4.

(1)结合图1-7和1-8观察确定内存变化的时刻,了解调试指令t的运行情况;

(2)DI的变化

图1-1-7

图1-1-8

 

5.

(1)结合图1-8和图1-9观察DX的变化;

(2)在调试过程中发现AX有非预期的变化,而原先也是有的,只是没注意到。

这个对于代码段的思路学习是没太大关系的。

图1-1-9

6.

(1)注意CX的变化;

7.

(2)标志位CF由NC变成了CY,判断为JB成立,执行A2

图1-1-10

7.

(1)存储顺序的检查,确定指针指在350B,即确定可以往后存储;

(2)压栈的变量(CX)变化时间,PUSH后并没有改变CX的值;

图1-1-11

8.

(1)出栈的变量(CX)变化,出栈后CX的值还原。

(在这里才提到是因为第一次循环中CX都是0004H,看不出变化)

(2)g命令的使用,它可以全部运行,方便查看最后的结果。

因为至此关于编程的几个要点已全部明确。

图1-1-12

9.

(1)检查执行结果,存储结果与预期相符。

(2)检查CX是否为预期的0,应用跟踪执行指令(‘t’),发现g只是一个断点,用于显示验证。

但内存已发生了改变。

图1-1-13

10.由于内存已变化,无法确定后续命令是否对内存产生效果,虽从内存上不知350C是否再一次得到赋值,但AX的变化也可知。

但更改350D的值,观察350D的变化也可以明显确定,形成对比。

图1-1-13

11.通过图1-14和图1-15可知,LOOP指令CX的计数方式。

图1-1-14

图1-1-15

2.程序设计:

将十进制的ASCII码转换为BCD

设从键盘输入的五位十进制数的ASCII码存放在2000H起始的内存单元内。

若输入的不是十进制数的ASCII码,则对应存放结果的单元内容为“FF”。

完成相应程序的编制,进行调试并验证结果。

2.1程序流程图

 

2.2程序

DATASSEGMENT

;此处输入数据段代码

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENTASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

;此处输入代码段代码

MOVCX,05h

MOVBX,2000H;存十进制数的ASCII码的起始位置

GET:

MOVAH,01H;键入十进制数

INT21H

;moval,31h

MOV[BX],AL;比较输入的所对应的ASCII码是否在0~9内

CMPAL,30H

JBerror

CMPAL,39H

JAerror

JMPcrec;不经过error

error:

;不是十进制数时,将FFH存入对应内存。

pushcx

movcx,0ffh

MOV[BX+1000H],cx

popcx

MOVDL,[BX+1000H];直接将FF做为ASCII码所对应的符号显示出来,用以检验

MOVAH,02H

INT21H

JMPendd

crec:

SUBAL,30H;如若属于0~9,则-30H即可得到对应的十进制数于内存中

MOV[BX+1000H],AL;将每一次翻过来的值放到3000H,3001H...3004H中

MOVDL,[BX+1000H];显示用以检查验证

adddl,30h

MOVAH,02H

INT21H

endd:

INCBX

LOOPGET;这种显示是一次输入对应两个地方的存储并分别显示。

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

2.3程序运行结果

若为0~9,则输入一个数显示一个数;若是除此之外的,则显示FFH做为ASCII所对应的字符,如图2-2所示。

另外,这种演示的前提是确定显示语句是正确的。

图2-2

实验二数据处理实验

一、实验目的

(1)进一步掌握在PC机上建立、汇编、链接和运行8086/88汇编语言程序的过程。

(2)通过阅读并调试数据处理的示例程序,完成程序设计题,掌握简单程序的结构。

二、实验内容

1.寻找最大数和最小数的程序

设在内存缓冲区BUF+1单元开始,存放8个单字节数,其数据长度在BUF单元,要求找出最大数送MAX单元,最小输送MIN单元。

假如第一个数是最大数,并送到MAX单元中,依次把余下的数送到MAX单元中,否则取下一个数,最后MAX单元中即为最大数。

同理可求出最小数。

1.1参考程序

DATASSEGMENT

;此处输入数据段代码

ORG100H;定义偏移首地址,方便寻找内存

BUFdb8,22,33,12,-1,-50,-32,97,127

MAXdb?

MINdb?

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX1.2实验流程图

;此处输入代码段代码

MOVCH,0

MOVCL,BUF;存个数数

DECCX;后面要循环比较七(8-1)次,先变成七

MOVAL,BUF+1;拿出第一个数放到最大数和最小数中,用于比较和更新

MOVMAX,AL;放到最大数

MOVMIN,AL

MOVBX,OFFSETBUF+2;拿第二个数与现有的最大最小值比较

LAST:

MOVAL,[BX];AL作为暂时存储的寄存器代表新来的要比较的值

CMPAL,MAX;判断是否更大

JGGREAT;若大(用于有符号比较),则跳转

CMPAL,MIN;判断是否更小,也可将相等的情况视作小于,则可省去,直接跳转至LESS即可

JLLESS;若小,也相应跳转

JMPNEXT;若相等,则直接跳过

GREAT:

MOVMAX,AL;大数更新

JMPNEXT

LESS:

MOVMIN,AL;小数更新

NEXT:

INCBX;BX取的是第二个数(用于排序)的地址,现在要指向下一个,即要判断下一个

LOOPLAST;第一次循环后,执行此句前cx为7,然后自减,判断是否继续。

;(第二个数已判断完)

;第七次循环后,执行此句前cx为1,然后自减,cx=0,结束。

;(第八个数已判断完)此时,最大最小值已经放好

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

 

2.程序设计1

设在内存缓冲区BUF+1单元开始,存放若干个单字节数,其数据长度在BUF单元,要求在这些数据中查找某个特定数据,若有则把存放在该字符的地址送AX,否则把FF送入AX。

完成相应程序的编制,进行调试并验证结果。

2.1流程图2.2程序

DATASSEGMENT;此处输入数据段代码

BUFDB8,2,33,10110111B,-5,65,30H,45H,20H

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

MOVAX,0;将要查找的数存起来,可以是AX,也可以是其他变量。

MOVBX,AX

MOVSI,OFFSETBUF;取地址

MOVCX,0;对整个CX清一下零

MOVCL,[SI];数据个数

A1:

INCSI;指向第一个数

CMPBL,[SI];是否是

JECREC;是的话

JMPERROR

CREC:

MOVAX,SI;将地址给AX

JMPEND1;完成退出

ERROR:

LOOPA1;不是的话,继续比较,;八次比较后,不再执行,进入下一语句

MOVAX,0FFH

END1:

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

实验三排序程序设计

一、实验目的

通过阅读并调试示例程序,完成程序设计题,掌握循环程序设计的方法。

二、实验内容

1.数的排序

在数据块BUF区存放10个无符号数,要求设计程序将这些数由小到大排序,排序后的数仍放在该区域中。

1.1设计思想

(1)从最后一个数据(或第一个数)开始,一次把相邻的两个数进行比较,即第N个数和第N-1个数比较,第N-1个数与第N-2个数比较等等;若第二个数大于第N个数则两者交换,否则不交换,直到N个数的相邻两个数都比较完为止。

此时,N个数的最小数将被排在N个数的最前列。

(2)对剩下的N-1个数重复上述步骤,找到N-1个数中的最小数。

(3)重复第二步,直到N个数全部排好为止。

(4)本程序的主体思想是冒泡法,通过从后往前每相邻两位的比较将最小数放到最前面,这样循环进行N-1回一定可以将N个数排好序。

但为了提高效率,引进另一种方法,如若在某回循环中,每一次相邻两数都是理想顺序,既不需要互换,则可以终止循环。

另外,注意有符号数和无符号数的比较命令。

1.2实验流程图1.3实验参考程序

DATASSEGMENT

BUFDB6,23,41,24,-3,-45,12,2,98,43

DATASENDS

STACKSSEGMENT

STACKSENDSCODESSEGMENT

ASSUME

CS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

movSI,OFFSETBUF+0AH;指针指到末尾数据的后一个字

MOVCX,0AH;设置第一次的比较次数以及总的循环回数

MOVBL,0FFH;设定交换标志

A1:

CMPBL,0FFH;每回向左移动最小数后,检查标志是否有改变,即是否有调整

JNZA4;若某回每两个相比都不存在交换,即该回每次都跳到A3,

;最后返到A1,这时bl还是00,而没被赋为ff,即顺序已排好,则退出

MOVBL,00H;起始设置,用以比较

DECCX;记录回数;如第一次只需要比较9次;

JZA4;最多比较9次就可以把顺序排好,第一次把最小的放在数据首位,

;第二次相当于对9个数排序;直至第九次对两个数排序

PUSHSI

PUSHCX;保存cx现有的值用以记录回数;每回的比较次数也保留了下来,用以每回的使用

A2:

DECSI;用以使每回的第一次指针指到末尾;由于SI需要增加,即指针需要左移,

MOVAL,[SI];将高侧(接近尾侧)地址(1回是10)的内容暂时放在AL中

DECSI;指向上一个地址(1回1次时是地址9)

CMPAL,[SI];(1回1次10和9比较)

JNCA3;10若不大于9,则不交换,直接进行该回下一次

XCHGAL,[SI];若10更小,需交换,把9内的值给AL,AL即10内的值放地址9中

MOV[SI+01H],AL;9的值给10

MOVBL,0FFH;交换标志

A3:

INCSI;由于SI指到了9,又限于A2开始有decsi,故需要增到需处理位的下一位;

;所以去掉“38”“29”更改“15”的0A-->09亦可

LOOPA2;每回的循环次数

POPCX;此时释放是因为记录回数

POPSI;从尾端再次开始

JMPA1;进行下一回的比较,

A4:

;最后跳出结果:

一是回数够了能保证顺序调整好,另一个是为了提高效率。

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

2.比较相等关系

bufX、bufY和bufZ是3个有符号十六进制数,编写一个比较相等关系的程序:

(1)如果这三个数都不相等,则显示0;

(2)如果这三个数中有两个数相等,则显示1;

(3)如果这三个数都相等,则显示2;

 

2.1程序流程图2.2程序

DATASSEGMENT

;此处输入数据段代码

ORG50h

bufXdb?

bufYdb?

bufZdb?

showdb"","$"

show1db"pleaseinputthreekeys","$"

show2db"theresultis","$"

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

;此处输入代码段代码

;--------------------------------------------

movah,09h;提醒输入

movdx,offsetshow1

int21h

movah,09h

movdx,offsetshow

int21h

movah,01h;数据采集

int21h

movbufX,al

;--------------------------------------------

movah,09h

movdx,offsetshow;blank

int21h

movah,01h

int21h

movbufY,al

;--------------------------------------------

movah,09h

movdx,offsetshow;blank

int21h

movah,01h

int21h

movbufZ,al

movah,09h

movdx,offsetshow2

;remebertooutput

int21h

;-------------------------------------------

MOVDL,30H

MOVBL,bufX

MOVCL,bufZ

CMPBL,bufY

JNEA2

INCDL

A2:

CMPBL,CL

JNEA3

INCDL

CMPDL,32H

JEEND1

A3:

CMPbufY,CL

JNEEND1

INCDL

END1:

MOVAH,02H

INT21H

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

 

2.3程序结果

1.三个数都不相等时

图3-2-2

2.三个数有两个相等时

图3-2-3

3.三个数都相等时

图3-2-4

实验四系统中断调用实验

一、实验目的

通过阅读并调试示例程序,完成程序设计题,掌握利用DOS中断的调用来实现人机对话的编程方法。

二、实验内容

1.人机会话程序

通过人机会话可以获取程序运行所需要的数据,本程序应用的DOS中断功能,涉及到了1、2、9、0AH四个功能的调用。

1.1设计思路

首先计算机询问用户姓名,等到用户输入姓名的汉语拼音,然后将它显示在屏幕上,请用户认可,用户键入“Y”程序结束,否则再次询问用户姓名。

1.2实验流程图1.3实验参考程序

DATASSEGMENT

;此处输入数据段代码

MESG1DB0DH,0AH,'Whatisyourname?

$'

MESG2DB'?

(Y/N)$'

BUFDB30;大接收字节数

DB?

;输入的总字节数

DB30DUP(?

);从这开始存要输入的数据

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS

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

当前位置:首页 > 自然科学

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

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