北邮微机原理与接口技术.docx
《北邮微机原理与接口技术.docx》由会员分享,可在线阅读,更多相关《北邮微机原理与接口技术.docx(14页珍藏版)》请在冰豆网上搜索。
北邮微机原理与接口技术
--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--
北邮—微机原理与接口技术
(1)(总12页)
微机原理与接口技术硬件实验报告
1.实验一微机实验平台介绍及IO的使用
1.1.实验目的
1.1.1通过实验了解和熟悉实验台的结构,功能及使用方法;
1.1.2通过实验掌握直接使用debug的I、O命令来读写IO端口;
1.1.3学会debug的使用及编写汇编程序。
1.2.实验内容及要求
1.2.1学习使用debug命令,并用I、O命令直接对端口进行读写操作,
1.2.2用汇编语言编写跑马灯程序。
(可以使用EDIT编辑工具。
)要求实现以下两个功能:
A.通过读入端口状态(ON为低电平),选择工作模式(灯的闪烁方式、速度等);B.通过输出端口控制灯的工作状态(低电平灯亮)。
1.2.3使用时要注意,电源打开时不得插拔电缆及各种器件,一定要在断电的情况下连接电路,否则可能会烧坏整个实验系统。
1.3.实验环境及背景
我们使用PCI_IDE50扁平电缆将PC机与实验扩展模块连接起来。
在扩展实验平台上,有八个发光二极管、八个拨码开关。
读取拨码开关和写发光二极管的端口地址已经被做成了0E8E0h。
连接的PC机上安装有DOS操作系统,并有MASM5开发工具。
图1扩展实验模块
1.4.实验步骤
1.4.1.使用debug的I、O命令读写端口
进入DOS,在命令行模式下输入命令debug,用-a选项写入下列程序:
CODE(debugmode)
MOVDX,E8E0
MOVAL,FE
OUTDX,AL
MOVAH,0B
INT21
ORAL,AL
JZ0100
INT20
输入结束后,直接输入回车即可推出-a。
然后,用-g选项运行程序,查看结果。
发现最右边的LED亮,其他不亮。
修改输出内容,再运行查看结果,可以发现:
当输出位对应为1时,灯灭;输出为0时,灯亮。
下面,我们来分析一下以下这段程序的作用。
CODE(debugmode)
MOVAH,0B
INT21
ORAL,AL
JZ0100
INT20
第一句是设置功能调用号,第二句是进行DOS功能调用,检测是否有键盘输入。
如果有键盘输入,则AL为00h,将由JZ0100H跳转;如果有键盘输入,则AL为0FFh,程序继续执行。
程序执行到20H中断时,结束程序。
值得一提的是,在有些语句中,16进制数并不需要以’h’结尾。
这个是因为在debug模式下,语句的读写本来就是按照16进制的,没必要像写汇编源代码(*.asm文件)一样用’h’将16进制数与10进制数区别开来。
1.4.2.使用文本编辑器edit和编译器masm
首先让我们来分析和设计一下这个程序。
这个程序“走马灯”需要速度可调、灯的移位方向可调、灯型可调,具有暂停功能,可以在用户需要的情况下结束程序(返回DOS)。
我们将这些控制端口设置在端口为0E8E0的拨码开关上。
具体开关的用途如下表:
表1拨码开关用途表
开关号
端口的第几位
向上拨(‘1’)的意义
向下拨(‘0’)的意义
S0
0
退出程序,返回DOS
程序正常进行
S1
1
走马灯向右循环移位
走马灯向左循环移位
S2
2
走马灯暂停
走马灯正在运动
S3
3
走马灯慢速运动
走马灯快速运动
S4
4
三个灯同时亮
只有一个灯亮
程序流程图:
图2走马灯流程图
程序代码:
CODE(marquee.asm)
;FILENAME:
marquee.asm
;AUTHOR:
XIAO,Zhiqing(No.13,Cl.07105)
;DATE:
20091209
;DESCRIPTION:
revolvingsceniclampswhichshiftineitherdirection
;USAGE:
switchers--(SW0isthemostleftone)
;SW0(play):
UPexitDOWNplay
;SW1(direction):
UPrightDOWNleft
;SW2(pause):
UPpauseDOWNplay
;SW3(speed):
UPslowDOWNfast
;SW4(mode):
UPthreelightsDOWNonelight
DataSEGMENT
SwStateDB0
LdStateDB0FEH
BufferDB0
DataENDS
StackSEGMENTSTACK'STACK'
DB100HDUP(0)
StackENDS
CodeSEGMENT
ASSUMEDS:
Data,SS:
Stack,CS:
Code
MainPROC
PUSHDS
XORAX,AX
PUSHAX
MOVAX,Data
MOVDS,AX
MOVldState,0FEh;initialize
CALLEndlessRepeat
RET;unreachableinstruction
MainENDP
;procedureEndlessRepeatisaprocedurethatdoprocedure
;‘ProcToRepeat’endlesstimes.
EndlessRepeatPROC
EndlessLoop:
CALLProcToRepeat
JMPEndlessLoop
RET;unreachableinstruction
EndlessRepeatENDP
ProcToRepeatPROC
CALLreadSw
CALLexcuteDirection
CALLexcuteMode
CALLexcutePause;duringthisprocedure,swsareread.
CALLexcuteReturnToDos
CALLexcuteSpeed
RET
ProcToRepeatENDP
;procedureDivFreqprovideclockwhosefrequencyisdivided
;by1000H*8000H=134.2Mtimes
DivFreqPROC
PUSHCX
MOVCX,1000H
MyLoop:
PUSHCX
MOVCX,8000H
MyNestedLoop:
DECCX
JNZMyNestedLoop
POPCX
DECCX
JNZMyLoop
POPCX
RET
DivFreqENDP
;readthestatesofswitchersfromInputPort
ReadSwPROC
PUSHAX
PUSHDX
MOVDX,0E8E0H
INAL,DX
MOVSwState,AL
POPDX
POPAX
RET
ReadSwENDP
;turnonandofftheledsbyOutputPort
WriteLdPROC
PUSHDX
PUSHAX
MOVAL,LdState
MOVDX,0E8E0H
OUTDX,AL
POPAX
POPDX
RET
WriteLdENDP
;iffirstswitcherisup,quittheprogramandreturntodos.
excuteReturnToDosPROC
TESTSWSTATE,01H
JZexitexcuteReturnToDos
CALLreturnToDos
exitexcuteReturnToDos:
RET
excuteReturnToDosENDP
ReturnToDOSPROC
MOVAX,4C00H
INT21H
ReturnToDOSENDP
excuteDirectionPROC
TESTSWSTATE,02H
JZshiftLeft
RORLDSTATE,01H
RORLDState,01H
shiftLeft:
ROLLDSTATE,01H
exitexcuteDirection:
RET
excuteDirectionENDP
;waituntilS2isdown
excutePausePROC
beginexcutePause:
CALLreadSw
TESTswState,04H
JNZbeginexcutePause
RET
excutePauseENDP
;slowmodedelaysaboutthreetimesasthatoffastmode
excuteSpeedPROC
CALLdivFreq
TESTswState,08H
JZexitexcuteSpeed
CALLdivFreq
CALLdivFreq
exitexcuteSpeed:
RET
excuteSpeedENDP
excuteModePROC
PUSHWORDPTRldState
TESTswState,10H
JZsimpleMode
;continuous3ledlightson
PUSHAX
PUSHBX
PUSHCX
MOVAL,ldState
MOVBL,AL
ROLBL,1
ANDBL,AL
MOVCL,BL
ROLCL,1
ANDAL,CL
MOVldState,AL
POPCX
POPBX
POPAX
simpleMode:
CALLwriteLD
exitexcuteMode:
POPWORDPTRldState
RET
excuteModeENDP
CodeENDS
ENDMain
运行结果:
编译、连接并运行后,程序运转正常。
所有选项都可以按照预期方式控制,且可以正确返回DOS。
例如,当S4往下拨后,同一时刻有且只有一个灯亮;
图3单灯模式
当S4往上拨时,同一时刻有且只有三个灯亮。
图4三灯模式
本实验达到要求,通过了验收。
1.5.思考题
通过实验说明用debug中的a命令录入实验中给出的小程序中,有些语句可以不写出“h”字符的原因。
在debug模式下,语句的读写本来就是按照16进制的,没必要像写汇编源代码(*.asm文件)一样用’h’将16进制数与10进制数区别开来。
1.6.心得体会
这次试验是我第一次微机原理试验。
在这次试验中,令我印象最深的是文本编辑器edit的使用。
在以前的学习生活中,在Windows下我一般用Notepad++,在Linux下我一般用vim,编程时还会用到一些IDE配套的文本编辑器。
这次,我第一次使用了文本编辑器edit。
这个文本编辑器和绝大多数图形用户界面的文本编辑器不是很相同。
例如,Windows下的Ctrl+C和Ctrl+V不能使用。
熟悉一个文本编辑器确实是不易的。
图5文本编辑器edit
第二个印象最深的地方是当程序进入死循环时,没有找到办法退出了。
这个特性对我的开发造成了一定的负面影响。
当我们用图形界面IDE进行开发时,当程序进入死循环时,可以强制关闭程序。
Linux下可以把这个进程kill掉。
而DOS下尚未发现解决办法。
这使得返回DOS的功能更加重要。
其实,能正确的终止,也反映了一个程序的有穷性。
参考资料
[1]徐惠民.微机原理与接口技术.北京:
高等教育出版社,2007.
[2]田辉,甘勇.微型计算机技术——系统、接口与通信.北京:
北京航空航天大学出版社,2001.
[3]王玉良.微机原理与接口技术.北京:
北京邮电大学出版社,2006.
[4]ftp:
//.访问时间:
2009年12月.
声明与致谢
本报告涉及所有源代码均属原创作品。
感谢电信工程学院实验中心和纪辉老师及其助教们的大力支持。