北邮微机原理 第二次软件实验报告Word文件下载.docx
- 文档编号:16635550
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:15
- 大小:252.30KB
北邮微机原理 第二次软件实验报告Word文件下载.docx
《北邮微机原理 第二次软件实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《北邮微机原理 第二次软件实验报告Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
判断输入的字符是否超出允许输入的范围,若超出范围,报错后返回程序开始处。
3)主程序。
初始化寄存器。
清屏。
(执行过程见注释部分)
显示字符串str1。
用于说明输入格式(xx:
xx)和输入后开始计时的方式(按回车键开始)
将输入的8个字符存入数据段。
使用DOS功能调用01H,通过DI,把存放在AL中的键入字符存入以tenhour为开始的数据段,并使用宏指令check判断输入字符是否超过范围。
键入回车,开始计时。
使用DOS功能调用01H,把键入的键与回车键对应码0DH进行比较。
若键入其他键,报错,返回程序开始。
将原来08H中断号设置的入口地址换成本程序中timer的起始地址,保证在发生08H中断时,程序自动进入timer过程。
为时钟计时器置初值。
43H端口是指8253三通道定时器中的命令寄存器,所使用的命令字36H表示选用0通道定时器,以3号方式(产生方波)计数等。
向端口40H送出的计数器初值选用11932是要求8253每秒发出100次时钟中断(08H)。
21H端口为中断屏蔽寄存器,用以开放外部中断。
显示“currenttimeis:
”;
显示计时,时钟不停的刷新。
调用子程序dispclk,逐个显示字符,并检测秒钟个位second是否有变化,以达到每秒更新一次显示的效果。
4)中断程序timer。
执行100次中断后,秒数+1;
依次判断秒钟、分钟、小时的个位和十位是否需要改变;
若不需要改变,继续调用中断。
5)子程序dispchar,显示字符
14号BIOS功能调用,显示AL中的字符到光标位置,且光标进一
程序的运行过程大致是:
主程序不停地显示时钟值,当发生时钟中断08H时,转入timer过程。
timer查看中断计数是否达到100次,如果没有达到则返回主程序;
如已达到,表明又过了1秒钟,则对时钟的值进行修改,然后再返回主程序。
2流程图
Timer中断程序:
显示字符的子程序diapchar只有一个内容,即使用14号BIOS功能调用,不再画图。
主程序:
3源代码
datasegment
count100db100;
中断次数100次
;
8位字符,格式**:
**:
**
tenhourdb0
hourdb0,'
:
'
tenmindb0
minutedb0,'
tensecdb0
seconddb0
;
用于提示的字符串
str1db'
range00:
00:
00~23:
59:
59,andhitentertobegin'
13,10,'
startingtimeis:
$'
str2db'
("
ctrl+c"
toexit)currenttimeis:
str3db'
timeformaterror!
13,10,13,10,'
dataends
stacksegmentstack
db256dup(0)
stackends
codesegment
assumeds:
data,cs:
code,ss:
stack
宏定义check。
形参为输入字符、可输入最大值和最小值
checkmacrox,min,max
localerr,mret;
注明在宏内部使用的标号
pushax
pushbx
moval,x
movbl,min
movbh,max
cmpal,bl
jlerr;
输入值小于最小值,报错
cmpal,bh
jgerr;
输入值大于最大值,报错
popbx
popax
jmpmret
err:
movdx,offsetstr3;
显示报错信息
movah,09h
int21h
jmpbegin
mret:
nop
endm
start:
movax,data
movds,ax
moves,ax
程序开始后,先清屏
movah,6;
当前页上滚
moval,0;
整个窗口空白
movch,0;
滚动区域的左上角的行
movcl,0;
滚动区域的左上角的列
movdh,42;
滚动区域的右下角的行
movdl,79;
滚动区域的右下角的列
movbh,7;
00000111,背景色黑、前景色白,正常的字符显示状态
int10h;
显示I/O
显示提示文字
begin:
movdx,offsetstr1
输入开始时间(格式“**:
**:
**”,8个字符),存入数据段
先录入小时:
第1位字符(小时的十位,0~2)
movdi,offsettenhour;
从目的操作数的第一位tenhour开始
movah,01h
int21h;
dos功能调用,键入字符
movbl,al;
bl备份字符
checkal,'
0'
'
2'
mov[di],al
第1位字符是0/1时,第2位字符(小时个位,0~9)
incdi;
指向下一字符
cmpbl,'
若键入“2”,转移
jztenhour2
9'
mov[di],al
jmpnextchar
第1位字符是2时,第2位字符(小时个位,要求是0~3)
tenhour2:
3'
再录入分钟、秒钟:
movbp,0
第3位字符(:
);
第6位字符(:
)
nextchar:
incdi
movah,01h
第4位字符(分钟十位,0~5);
第7位字符(秒钟十位,要求是0~5)
5'
第5位字符(分钟个位,0~9);
第8位字符(秒钟个位,0~9)
录入第3/4/5位字符后,继续录入第6/7/8位字符
incbp
cmpbp,1
jenextchar
键入回车,开始计时
cab:
cmpal,0DH
jzhuanh
movdx,offsetstr3;
键入的不是回车,显示报错信息,回到开始
huanh:
movah,02h;
回车换行
movdl,13
movdl,10
将原来08H中断号设置的入口地址换成本程序中timer的起始地址
cli;
中断标志置零,禁止可屏蔽中断
movax,0
moves,ax;
DI对应的段地址寄存器ES
movdi,20h;
相应中断向量的地址4*8=32=20h
movax,offsettimer;
AX存入timer程序的段内偏移量
stosw;
字符串填充,把AX中的内容存入地址20H
movax,cs;
timer程序的代码段地址
stosw
为时钟计时器置初值
moval,36h;
36H表示选用0通道定时器,以3号方式(产生方波)计数等
out43h,al;
输出到43H端口(8253三通道定时器中的命令寄存器)
movbx,11932;
BX存入计数器初值11932(方波频率100Hz,周期10毫秒)
要求8253每秒发出100次时钟中断(08H)
moval,bl;
将BX送入40H端口
out40h,al;
低四位
moval,bh
高四位
moval,0fch;
恢复为允许中断
out21h,al
sti;
中断标志置1,允许中断
forever:
movdx,offsetstr2;
显示提示信息
movbx,offsettenhour;
BX存放时间信息首字符tenhour的偏移量
movcx,8;
8个字符,所以循环8次来显示
dispclk:
moval,[bx];
对应字符存入AL
calldispchar;
调用子程序,显示存放在AL中的字符
incbx;
指向下一个字符
loopdispclk;
循环直到显示完所有的字符
moval,0dh
回车
moval,second
next:
cmpal,second;
直到秒钟个位second改变(过了1秒)时,再重新显示当前时间
jznext
jmpforever
timer中断程序语句
timerprocfar
pushax
deccount100;
执行100次中断
jnztimerx
movcount100,100;
恢复count100的值,用于下一次循环计数
incsecond;
100*10毫秒=1秒
判断秒钟的两位是否需要改变
cmpsecond,'
jletimerx;
个位没到9,不变
movsecond,'
个位是9,变为0,十位加1
inctensec
cmptensec,'
6'
jltimerx;
十位没到6,不变
movtensec,'
十位是6,变为0
incminute;
执行到此步,表示秒钟从60变为00,需要分钟加1
判断分钟的两位是否需要改变,处理方式与秒钟相同
cmpminute,'
jletimerx
movminute,'
inctenmin
cmptenmin,'
jltimerx
movtenmin,'
inchour;
执行到此步,表示分钟从60变为00,需要小时加1
判断时钟的两位是否需要改变
cmptenhour,'
jlnexth;
十位没到2,转移到nexth,判断个位
cmphour,'
jlenexth;
十位是2,个位小于等于3,不作进位改变
movhour,'
小时从24变为00
movtenhour,'
jmptimerx
nexth:
jaadjhour;
个位是9,转移到adjhour:
个位变0,十位加1
jmptimerx;
adjhour:
inctenhour
调用08H中断
timerx:
moval,20h
out20h,al
iret
timerendp
子程序,写字符到当前光标位置
dispcharproc
movbx,0
movah,14;
BIOS功能调用,显示AL中的字符到光标位置,且光标进一
int10h;
显示I/O
ret
dispcharendp
codeends
endstart
4子程序清单
子程序名:
timer
功能:
查看中断计数是否达到100次,如果没有达到则返回主程序;
所用寄存器:
ax,fr,
入口参数:
tenhour,hour,tenmin,minute,tensec,second,存放在数据段
出口参数:
tenhour,hour,tenmin,minute,tensec,second
dispchar
写字符到当前光标位置
bx,ah,al
需要显示的字符,存放在al中。
无
三、实验结果
实现了实验要求的功能。
运行程序后,清屏,输入开始时间(格式XX:
XX:
XX),按回车键后显示时、分、秒,并不断刷新时间;
当键入ctrl+c时,停止计时,返回系统,且系统正常运行不死机。
1)编译和连接
2)运行程序,清屏
3)输入25时,超过范围,报错;
输入字符a,报错;
输入8位时间信息后,再输入除了回车键的任意字符,报错;
输入8位时间信息后,按回车键,开始。
输入开始时间为23:
50,截图显示了时跨越。
ctrl+c退出。
程序的不足:
开始时间需要一次输对。
例如,输入23:
50后想修改分钟为59,按后退键,报错。
四、实验总结
通过本次实验,我学会了配置8253和8259,进行定时及中断,理解了中断的意义及中断的使用方法。
理解了中断服务子程序和一般子程序运行的区别:
中断服务程序由中断源满足中断条件时触发,不能被主程序调用;
一般子程序由主程序或其他子程序调用执行。
本次实验是最后的综合性实验,它用到了前面的很多知识和方法,同时还用到了一些硬件资源,需要查资料来编写代码。
此次实验加深了我对汇编语言的理解和中断服务的理解,对我掌握中断服务很有帮助。
本次实验我获益匪浅。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮微机原理 第二次软件实验报告 微机 原理 第二次 软件 实验 报告