微机原理实验指导书.docx

上传人:b****5 文档编号:4378356 上传时间:2022-12-01 格式:DOCX 页数:23 大小:30.01KB
下载 相关 举报
微机原理实验指导书.docx_第1页
第1页 / 共23页
微机原理实验指导书.docx_第2页
第2页 / 共23页
微机原理实验指导书.docx_第3页
第3页 / 共23页
微机原理实验指导书.docx_第4页
第4页 / 共23页
微机原理实验指导书.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

微机原理实验指导书.docx

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

微机原理实验指导书.docx

微机原理实验指导书

 

微型计算机原理与应用

实验指导书

 

上海大学通信学院

2010年4月

 

PC微机原理实验一

一、目的:

掌握PC机DEBUG调试程序有关命令的操作及8086各类指令的

功能。

二、要求:

在PC机上完成下列程序的调试运行,并写出运行结果。

1.DEBUG的基本操作:

(详细内容请参阅教材“程序的调试,P173”和“附录F调试程序DEUBG的使用,P499”)

(1)从WINDOWS进入DOS之后,输入命令启动DEBUG:

C:

>DEBUG回车

(2)输入R命令,查看和记录CPU各个寄存器的内容:

-R回车

看到什么?

(3)输入A命令,汇编下面的字符“WINDOWS”显示程序:

-A 100;从偏移地址是0100H处开始写指令

MOVAH,2

MOVDL,57;57H是“W”的ASCII码

INT21;INT21是DOS功能调用,AH=2代表2号功能

;这3句合起来的功能是:

显示DL中的字符

MOVDL,49

INT21

MOVDL,4E

INT21

MOVDL,44

INT21

MOVDL,4F

INT21

MOVDL,57

INT21

MOVDL,53

INT21

INT3;功能是产生一个断点,不要省略

(4)输入U命令反汇编上面的程序:

-U100

问:

这里100代表什么?

(5)输入G命令连续运行上面的程序,记录运行结果:

-G=100

(6)输入E命令把上面程序中的数据57,49,4E,44,4F,57,53依次分别改为57,

45,4C,43,4F,4D,45:

-E103回车(以下同)

-E107

-E10B

-E10F

-E113

-E117

-E11B

(7)输入D命令查看程序机器码的存放情况:

-D10011E;看从100开始到11E的机器码

(8)输入G命令再连续运行程序,并记录运行结果:

-G=100

(9)依次输入下面的T命令(单步执行)和G命令(设置断点并启动运行),记录各

命令的运行结果:

-T=100回车

-G=100106回车

-G=10010A回车

-G=10010E回车

-G=10011E回车

 

注意:

下面第2—第8段程序是7个实用的小程序,若不小心打错指令,可以这样修改:

例如:

CS:

0100B300MOVBL,0

010253PUSHBX

0103B220LP1:

MOVDL,20

要修改“PUSHBX”,因为这条指令的IP是0102,所以按以下操作:

-A0102回车,然后把正确的指令打入,“-A”是汇编指令。

如果要查看0100以后的指令及相应的机器代码,可以

-U0100回车,能够看到CS:

0100开始的指令及相应的机器代码。

“-U”是反汇编

若发现有误用,用“-AXXXX回车”,重打这条指令即可

2.编制一个能在CRT上连续显示A,B,C,D······Z大写英文字符的源程序,并在源程序下汇编调试机运行。

参考源程序(DEBUG调试环境中,源程序的十六进制数后面不写H):

CS:

0100B300MOVBL,0

010253PUSHBX

0103B220LP1:

MOVDL,20

0105B402MOVAH,02

0107CD21INT21

01095BPOPBX

010A88D8MOVAL,BL

010CFEC0INCAL

010E3C1BCMPAL,1B

01107502JNZLP2(0114);不能写LP2,应写0114

0112B001MOVAL,01

011488C3LP2:

MOVBL,AL

011653PUSHBX;

01170440ADDAL,40

011988C2MOVDL,AL

011BB402MOVAH,02

011DCD21INT21

011FB9FFFFMOVCX,FFFF

012249DL:

DECCX

012375FDJNZDL(0122);不能写DL,应写0122

0125EBDCJMPLP1(0103);

按CTRL+C,可中止程序运行。

运行正确后,改写程序为0,1,2,3,4,5,7,8,9的循环显示。

3.编制一个3字节压缩BCD加法源程序

若要实现123456+456789,根据低地址放低字节,高地址放高字节原则,请用E命令在DS:

1000-1002单元正确存放被加数123456,在DS:

1010-1012单元正确存放加数456789。

参考程序如下:

CS:

0200BE0010MOVSI,1000

0203BF1010MOVDI,1010

0206BB2010MOVBX,1020

0209B103MOVCL,3

020BB500MOVCH,0

020DF8CLC

020E8A04MAD:

MOVAL,[SI]

02101205ADCAL,[DI]

021227DAA

02138807MOV[BX],AL

021546INCSI

021647INCDI

021743INCBX

0218E2F4LOOPMAD(020E)

021AF4HLT

运行结果:

[1020]=______[1021]=______[1022]=______SI=______DI=______BX=_____

相加后结果是:

_________________

F标志:

O=______S=______Z=______A=______P=______C=______

注意:

按CRT的实际显示填写。

(参考书P502)

思考:

DAA的作用,如果没有DAA结果会如何?

 

4.一字节十六进制数转换为ASCII码(只考虑大写字母)

用E命令在DS:

1000单元中存放十六进制数5A

调试运行下面程序:

CS:

03008D360010LEASI,[1000]

03048D3E2010LEADI,[1020]

03088A04MOVAL,[SI]

030A240FMOVBL,AL

030C240FANDAL,0F

030EE80E00CALLCHANG(031F)

031180E30ANDBL,F0

0314B90400MOVCX,4

0317D2EBSHRBL,CL

031988D8MOVAL,BL

031BE80100CALLCHANG(031F)

031EF4HLT

031F3C09CHANG:

CMPAL,09

03217602JBEAD30(0325)

03230407ADDAL,07

03250430AD30:

ADDAL,30

03278805MOV[DI],AL

032947INCDI

032AC3RET

运行结果:

[1020]=______[1021]=______

思考:

NOP是空操作指令,若在ADDAL,07后面,加一条NOP,结果会如何?

5、搜索字符串结束标志,统计搜索的字符个数

用E命令在DS:

1000开始的单元中存放若干个ASCII字符,如:

30,31,32……39,0D。

(0D作为字符串结束标志),

调试运行下面程序

CS:

01008D3E0010LEADI,[1000]

0104B200MOVDL,0

0106B00DMOVAL,0D

0108AEAGAIN:

SCASB;书P150,AL减去[DI],INCDI01097404JEDONE(010F)

010BFEC2INCDL

010DEBF9JMPAGAIN(0108)

010F8D1E2010DONE:

LEABX,[1020]

01138817MOV[BX],DL

0115F4HLT

运行结果:

搜索的字符个数存放在___________单元,该单元的值是___________

AL=__________BX=__________DL=__________

思考:

把SCASB换成通用指令,如何改?

6、编制一个将N个带符号的正、负数分开的源程序。

设N=10,用E命令在DS:

1000-1009单元存放10个数(1字节):

01,02,03,04,06,FF,80,81,06,07

将该数据块正、负数分开,正数放在1010为首地址的单元中,负数放在1020为首地址的单元中。

参考程序:

CS:

0300BE0010MOVSI,1000

0303BF1010MOVDI,1010

0306BB2010MOVBX,1020

0309B90A00MOVCX,000A

030CACG1:

LODSB;书P150,[SI]送给AL;INCSI

020DA880TESTAL,80

030F7503JNZMINUS(0314)

0311AASTOSB;书P150,AL送给[DI];INCDI

0312EB05JMPAGAIN(0319)

0314887DFMINUS:

XCHGBX,DI

0316AASTOSB

031787DFXCHGBX,DI

031949AGAIN:

DECCX

030A75F0JNZG1(030C)

031CF4HLT

运行结果:

[1010]=_______[1011]=______[1012]=______[1013]=_____[1014]=_____

[1015]=_______[1016]=______[1020]=______[1021]=_____[1022]=_____

思考:

二条XCHG作用是什么?

如果不用STOSB(功能见书P150),程序能更简洁吗?

7、编制一个将N个ASCII字符进行偶校验的源程序。

设N=8,用E命令在DS:

1000—1007单元放8个ASCII字符

31,32,33,34,41,42,43,44

参考程序:

CS:

04008D360010LEASI,[1000]

04048D1E1010LEABX,[1010]

0408B90800MOVCX,8

040BACAGAIN:

LODSB

040C20C0ANDAL,AL

040E7A07JPENEXT(0417)

04100C80ORAL,80

04128807MOV[BX],AL

041443INCBX

0415EB03JMPLP1(041A)

04178807NEXT:

MOV[BX],AL

041943INCBX

041A49LP1:

DECCX

041B75EEJNZAGAIN(040B)

041DF4HLT

运行结果:

1000—1007单元内容:

___________________________________________

1010—1017单元内容:

___________________________________________

改上述程序进行奇校验,写出运行结果:

1000—1007单元内容:

___________________________________________

1010—1017单元内容:

___________________________________________

8、找出无序的有符号数中的最小值和最大值

用E命令在DS:

1000—100A中存放11个数:

0A,80,84,82,83,81,01,02,05,04,03,其中0A为数列的个数。

调试运行下面程序:

CS:

02008D1E0010LEABX,[1000]

02048D361010LEASI,[1010]

02088D3E2010LEADI,[1020]

020CB500MOVCH,0

020E8A0FMOVCL,[BX]

021049DECCX,

021143INCBX

02128A07MOVAL,[BX]

02148804MOV[SI],AL

02168805MOV[DI],AL

021843INCBX

02198A07AGAIN:

MOVAL,[BX]

021B3A04CMPAL,[SI]

021D740CJENEXT(022B)

021F7F04JGGET(0225)

02218804MOV[SI],AL

0223EB06JMPNEXT(022B)

02253A05GET:

CMPAL,[DI]

02277C02JLNEXT(022B)

02298805MOV[DI],AL

022B43NEXT:

INCBX

022C49DECCX

022D75EAJNZAGAIN(0219)

022FF4HLT

运行结果:

[1010]=____________[1020]=____________

若求无符号数中的最小值和最大值,请修改并调试运行程序。

PC微机原理实验二

一、目的:

掌握8088汇编语言程序的编辑、宏汇编、连接及运行的操作步骤,进一步掌握编制源程序的格式,了解编辑程序EDIT、宏汇编MASM、联机程序LINK的功能,熟悉具有扩展名.ASM、.OBJ、.LST、.EXE等文件查询。

二、要求:

在DOS环境下,用EDIT文件编辑***.ASM源程序并存盘,用MASM文件汇编无误,用LINK文件连接无误,然后在DOS下运行***.EXE文件,用DEBUG文件检查运行结果。

最后写出程序运行结果。

运行以下程序()后,检测结果是否按从小到大的次序(ASCII码值)。

排序算法可以参考教科书P114例4.3.10。

显示一串字符可以参考教科书P146例4.3.19。

例如要显示BUF1中的字符,可以这样写:

MOVDX,OFFSETBUF1

MOVAH,9

INT21H;(AH)=9显示一串字符,首地址:

DS:

DX(书P146)

源程序如下:

NAME:

STACKSEGMENTSTACK

DW256DUP(?

TOPLABELWORD

STACKENDS

DATASEGMENT

BUF1DB43H,47H,46H,41H,42H,30H,31H,32H,33H,34H,’$’

BUF2DB0DH,0AH,’$’;使光标回车换行(参书P147)

DATAENDS

CODESEGMENT

ASSUMECS,CODE,DS:

DATA,SS:

STACK

START:

MOVAX,DATA

MOVDS,AX

MOVAX,STACK

MOVSS,AX

MOVSP,OFFSETTOP;前几句几乎是固定格式

MOVDX,OFFSETBUF1

MOVAH,9

INT21H;显示BUF1中未排序的原始数据

MOVDX,OFFSETBUF2

MOVAH,9

INT21H;使光标回车换行(参考书P147)

MOVCX,10;因为BUF1是10个字节

;下面是排序算法的主体部分

MOVSI,CX;SI指向DATBUF最后一单元加1

MOVBL,0FFH;BL中置标志0FFH

LOOPA:

CMPBL,0FFH;(BL)不为0FFH则转DONE

JNZDONE

MOVBL,00

DECCX;外循环修正CX

JZDONE

PUSHSI;SI,CX---堆栈

PUSHCX;

LOOPB:

DECSI;内循环修正指针

MOVAL,[SI]

CMPAL,[SI-1]

JAELA

XCHGAL,[SI-1]

MOV[SI],AL

MOVBL,0FFH

LA:

LOOPLOOPB

POPCX

POPSI

JMPLOOPA

DONE:

MOVDX,OFFSETBUF1;

MOVAH,9;

INT21H;显示BUF1中已经排序的有序数据

MOVCX,LENGTHDATBUF

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

MOVAH,4CH

INT21H;返回DOS

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

CODEENDS

ENDSTART

思考:

(1)如果要求程序执行后,显示

Pleaseenterstring:

142AFC7回车;(当场输入原始数据)

1247ACF;(排序后的结果)

该如何修改程序?

(2)实验一的第3题“编制一个3字节压缩BCD加法源程序”改写成标准汇编

例如,至少写成这样:

A+B=C

INPUTA=;输入被加数

INPUTB=;输入加数

RESULT=;计算的和

提示:

显示程序可以参考书P146

 

PC微机原理实验三

(PC机发声程序)

一.目的:

了解8254定时器、8255可编程外围接口芯片的工作原理,掌握对这些芯片的编程方法

二.要求:

根据参考例子,自己编写一个简单的曲子。

注:

可以参考书P400“扬声器驱动原理逻辑图”

PC机上的大多数输入/输出(I/O)都是由8255可编程序外围接口芯片管理的。

它包括三个8位寄存器,两个用于输入功能,一个用于输出功能。

输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。

输出寄存器中的两位来选择扬声器的驱动方式,当输出寄存器(I/O端口61H)的第0位为l时,控制8254定时器来驱动扬声器,当第l位为l时,扬声器的门电路接通,并一直保持到位1变为0时关闭。

连接到扬声器上的是8254的2号定时器,它实际上是一个振荡电路,此电路向扬声器发送指定频率的脉冲,当输出端口61H控制扬声器为接通状态时,就发出了一定频率的声音。

PC机内的R0MBIOS中有个BEEP子程序,它能根据BL中给出的时间计数值控制8254定时器,产生持续时间为1个或几个0.5秒,频率为896Hz的声音,这个子程序的用途是当“加电自测"系统发现硬件错误后,由ERROR—BEEP处理程序调用BEEP子程序,使扬声器发出“嘟嘟’’的信号。

BL中的时间计数值由ERROR—BEEP程序设置为533H,BEEP子程序将此计数值送给8254的定时器2来产生896Hz的声音,然后BEEP又将AL的第0位和第l位置1,并把AL的值送到8255的输出寄存器(1/O端口61H),使扬声器接通发出声音。

实际上BEEP是一个很好的通用发声程序,我们可以利用并修改BEEP,使其产生任一频

率的声音。

为此我们需要做两点修改,首先,BEEP程序只能产生896Hz的声音,我们的通用发声程序应能产生任一频率的声音。

其次,BEEP产生声音的持续时间(音长)只能是0.5秒的倍数,我们希望声音的持续时间易于调整,例如可以是l0ms的倍数。

我们知道BEEP是将计数值533H送给定时器2产生896Hz的声音的,那么产生其它频率

声音的时间计数值应为:

533H×896÷给定频率=l23280H÷给定频率

假定发声的频率存放在D1寄存器中,下面的指令在AX中得到送往定时器.2的计数值:

MOVDX,l2H

MOVAX,533H*896

DⅣDI

10ms的延迟时间可以简单地通过执行循环指令取得:

WAIT:

MOVCX.2801

DELAY:

LOOPDELAY

注意:

这个时间是在老的8086上运行的时间,现代“奔腾”要快得多,必须调整!

如果要产生与l0ms成倍数的延迟时间,可在BX寄存器中放入倍数。

例如要产生l秒的持续

时间,则在BX中放入100,以控制LOOP指令执行100×2801次,也就是10ms的100倍。

指令

如下:

MOVBX,100

WAIT:

MOVCX,2801

DELAY:

LOOPDELAY

DECBX

JNZWAIT

这样我们就能在修改后的BEEP程序的基础上编写一个任一频率(由Dl指定)和任一持续时

间(由CX和BX指定)的通用发声程序。

它包括三个步骤:

1.在2号定时器中的43端口送一个特定的数OB6H(101101lOB),此数对定时器的方式寄存器进行初始化,使定时器2准备接收计时常数。

2.在2号定时器中的42H端口装入一个l6位的计时常数(5

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

当前位置:首页 > 高中教育 > 小学教育

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

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