微机原理实验指导书.docx
- 文档编号:25273975
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:30
- 大小:27.35KB
微机原理实验指导书.docx
《微机原理实验指导书.docx》由会员分享,可在线阅读,更多相关《微机原理实验指导书.docx(30页珍藏版)》请在冰豆网上搜索。
微机原理实验指导书
微型计算机原理与应用
实验指导书
上海大学通信学院
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”显示程序:
-A100;从偏移地址是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
,57,53依次分别改为574F4E57(6)输入E命令把上面程序中的数据,49,,44,,45:
,,45,4C43,4F4D,-E103回车(以下同)
-E107
10B-E
-E10F
113-E
117-E
11B-E
(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
BXPOP5B0109
010A88D8MOVAL,BL
ALFEC0010CINC
CMPAL,1B3C1B010E
JNZ0110LP2(0114);不能写LP2,应写7502
01140112B001
MOVAL,01
LP2:
88C3MOVBL,AL0114
011653PUSHBX;
ADDAL,4004400117
88C20119MOVDL,AL
B402MOVAH,02011B
011DCD2121INT
MOV011FB9FFFFCX,FFFFDECCXDL:
012249
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],INCDI
01097404JEDONE(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
AL,80020DA880TEST
MINUS(0314)JNZ030F7503
;INCDI,AL送给[DI];书P1500311AASTOSB
JMPAGAIN(0319)0312EB05
BX,DI0314887DFMINUS:
XCHG
STOSBAA0316
BX,DI87DFXCHG0317
CX49AGAIN:
DEC0319
G1(030C)JNZ030A75F0
HLT031CF4
运行结果:
[1014]=_____[1013]=_____[1010]=_______[1011]=______[1012]=______
[1022]=_____[1021]=_____[1015]=_______[1016]=______[1020]=______
),程序能更简洁吗思考:
二条XCHG作用是什么如果不用STOSB(功能见书P150
个ASCII字符进行偶校验的源程序。
7、编制一个将NASCII字符单元放1000—10078个设N=8,用E命令在DS:
,44,42,434131,32,33,34,参考程序:
SI,[1000]LEACS:
04008D360010
BX,[1010]LEA04048D1E1010
CX,8MOV0408B90800
AGAIN:
LODSB040BAC
ANDAL,AL040C20C0
NEXT(0417)JPE7A07040E
AL,80OR04100C80
MOV[BX],AL04128807
BXINC041443
LP1(041A)EB030415JMP
[BX],ALMOVNEXT:
88070417
041943INCBX
DEC041ALP1:
49CX
AGAIN(040B)041BJNZ75EE
HLTF4041D
运行结果:
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)
;因为BUF1MOVCX,10是10个字节
;下面是排序算法的主体部分;SI指向DATBUF最后一单元加MOVSI,CX1
;BL中置标志BL,0FFH0FFHMOV
;(BL)不为LOOPA:
CMPBL,0FFH0FFH则转DONE
DONEJNZ
MOVBL,00
DECCX;外循环修正CX
DONEJZ
;SI,CX---堆栈SIPUSH
;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
LOOPDELAY:
DELAY.
注意:
这个时间是在老的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位的计时常数(533H×896/频率),以建立将
要产生的声音频率。
3.把输出端口61H的0、1两位置1,发出声音。
下面举例说明8253计数器2产生一定频率的方波并送至扬声器发音的程序
例:
欲使8253的计数器2产生600Hz的方波,经滤波后送至扬声器发音,当按下任一键时声音停止。
试编写此程序。
8253的端口地址为40H~43H,8255A的端口地址为60H~63H。
.
解:
计数器2的时钟输入:
T2=t/f2=t/1.19MHz≈840ns
方波发生器OUT2的输出周期为:
1/600Hz≈m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 实验 指导书