1、北邮微原作业中断实验与编程分析微原第二次软件实验一、 实验要求编写一程序,在显示器上显示时、分、秒。具体要求如下:1) 借用计数器8253的Timer()作为中断源,通过8259A向CPU发中断,每10ms产生一次中断;2) 在中断服务程序中管理刷新时、分、秒;3) 输入文件名后清屏显示:Current time is : XX:XX:XX(时、分、秒键盘输入);4) 当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。二、 设计思路1) 数据段定义四个字符串,分别用于显示程序功能、提示用户输入,显示当前时间以及错误格式输入提示。同时定义六个变量用于存储当前显示的的时、分、秒的十位
2、及个位,一个变量count100用以中断计数;2) 在BIOS功能调用中,令AH=6,设置窗口左上角、右下角行列位置使当前页上滚,从而实现程序一开始的清屏功能;3) 提示用户输入起始时间时,需要对输入格式进行判断,严格要求输入在00:00:00至23:59:59,正确输入时则存入相应的变量中,输入任意键开始计时,错误时则屏幕显示输入错误,提示用户重新进行输入,若输入为“CTRL+C”时退出程序;4) 利用8253作为中断源,输入控制字36H,时间常数为11932,使其选用通道0计数,产生频率100Hz的方波,即中断100次时间间隔为1s,时间刷新显示;5) 8253中断源每中断一次,进入tim
3、er中断子程序,将其段基地址及段内偏移量存入中断向量表,利用8259向CPU发出中断;6) timer子程序会对中断次数进行判断,每中断满100次时根据当前时间进行相应的时、分、秒修改,若不满100次时直接退出中断;7) 屏幕显示时将时、分、秒的十位和个位分别送人al中,在BIOS功能调用中令ah=14h,实现将al中的字符写到光标位置,并将光标进一,8次循环直到时钟完全显示,同时比对second,中断满100次时,即时间间隔1s时second变化,当检测到这一变化时重新进入disp刷新显示;8) 在每秒变化需要刷新显示时,都先进行键盘输入判断,当有输入且输入为“ctrl+c”时,退出程序。三
4、、 程序流程1) 主要程序流程图2) 中断程序流程图四、 源代码data segment count100 db 100 tenhour db 0 hour db 0,: tenmin db 0 minute db 0,: tensec db 0 second db 0 s1 db (00:00:0023:59:59 Ctrl+C to exit key to start)$ s4 db Starting time is:$ s2 db (Ctrl+C to exit)Current time is:$ s3 db Error!,0dh,0ah,$ data ends stack segmen
5、t stack db 256 dup(0) stack ends;回车换行宏定义 CRLF MACRO mov ah,02h mov dl,0dh int 21h mov dl,0ah int 21h ENDM code segment assume ds:data,cs:code,ss:stack start:mov ax,data mov ds,ax mov es,ax ;清屏 mov al,0 ;整个窗口为空白 mov ch,0 ;窗口左上角的行位置 mov cl,0 ;窗口左上角的列位置 mov dh,24 ;窗口右下角的行位置 mov dl,79 ;窗口右下角的列位置 mov bh,
6、7 ;正常显示属性 mov ah,6 ;当前显示页上滚功能调用号 int 10h ;I/O中断调用begin: mov dx,offset s1 mov ah,09h ;程序提示 int 21h CRLF mov dx,offset s4 mov ah,09h ;提示输入 int 21h mov bp,0 ;分输入正确后加一,跳转为秒输入判断 mov di,offset tenhour mov ah,01h int 21h cmp al,03h jnz goon1 ;读取第一位,不为ctrl+c则继续键入 mov ah,4ch int 21h goon1: mov bl,0 ;第一位为0到2
7、cmp al,bl jl tiaoban mov bl,2 cmp al,bl jg tiaoban mov di,al ;存入tenhour mov bh,al inc di mov ah,01h int 21h cmp al,03h jnz goon2 ;读取第二位,不为ctrl+c则继续键入 mov ah,4ch int 21h goon2: cmp bh,2 ;如果第一位为2,则第二位为0到3 je tenhour2 mov bl,0 ;第二位为0到9 cmp al,bl jl tiaoban mov bl,9 cmp al,bl jg error mov di,al ;存入hour
8、jmp nextchar tiaoban: jmp error ;用于跳转tenhour2: mov bl,0 cmp al,bl jl error mov bl,3 cmp al,bl jg error mov di,al nextchar: inc di mov ah,01h int 21h cmp al,03h jnz goon3 ;读取第三位,不为ctrl+c则继续键入 mov ah,4ch int 21h goon3: mov bl,: ;第三位为: cmp al,bl jne error inc di mov ah,01h int 21h cmp al,03h jnz goon4
9、;读取第四位,不为ctrl+c则继续键入 mov ah,4ch int 21h goon4: mov bl,0 ;分、秒均为00-59 cmp al,bl jl error mov bl,5 cmp al,bl jg error mov di,al ;存入tenmin或tensec inc di mov ah,01h int 21h cmp al,03h jnz goon5 ;读取第五位,不为ctrl+c则继续键入 mov ah,4ch int 21h goon5: mov bl,0 cmp al,bl jl error mov bl,9 cmp al,bl jg error mov di,a
10、l ;存入minute或second inc bp cmp bp,1 ;bp为1则继续读取秒钟输入 je nextchar signal: mov ah,0bh ;输入任意键开始计时 int 21h or al,al jz signal ;无输入继续检测,有输入才开始 CRLF ;换行回车 jmp init error: mov dx,offset s3 mov ah,09h int 21h ;显示错误提示信息 JMP begin ;重新读取init: cli ;关中断 mov ax,0 mov es,ax ;置附加段基地址为0 mov di,20h ;中断号08h*4 mov ax,offs
11、et timer ;中断程序的段内偏移量 stosw ;偏移量存入中断向量表 mov ax,cs ;中断程序段基地址 stosw ;段基地址存入中断向量表 mov al,36h ;选用0通道计数器,采用3号方式(方波)计数 out 43h,al mov bx,11932 ;时间常数,输出100HZ方波 mov al,bl out 40h,al mov al,bh out 40h,al mov al,0fch out 21h,al ;21h端口为中断屏蔽寄存器,用以开发外部中断 sti ;开中断;屏幕显示当前时间,变化时刷新显示disp: mov ah,0bh int 21h or al,al
12、jz noexit ;系统无输入时不退出 mov ah,08h int 21h cmp al,03h jnz noexit mov ah,4ch int 21hnoexit: mov dx,offset s2 mov ah,09h int 21h mov bx,offset tenhour mov cx,8 dispclk: mov al,bx call dispchar inc bx loop dispclk ;时分秒存入al并显示 mov al,0dh call dispchar mov al,second ;时间变化时秒个位必变化next: cmp al,second je next ;
13、无变化时循环 jmp disp ;有变化时刷新显示 ;中断一百次即为1s,时间相应变化 timer proc far push ax dec count100 jnz timerx mov count100,100 inc second cmp second,9 ;小于等于9,即之前秒个位为0-8 jle timerx ;秒个位0-8,变化后秒个位加1显示即可 mov second,0 ;原个位为9,变化后为0 inc tensec cmp tensec,6 jl timerx ;加1后小于5,即原秒十位为0-4,十位加1即可显示 mov tensec,0 inc minute ;与秒同理 c
14、mp minute,9 jle timerx mov minute,0 inc tenmin cmp tenmin,6 jl timerx mov tenmin,0 inc hour cmp tenhour,2 jl nexth cmp hour,3 jle timerx mov hour,0 mov tenhour,0 jmp timerx nexth: cmp hour,9 jle timerx adjhour: inc tenhour mov hour,0 timerx: mov al,20h out 20h,al pop ax iret ;中断退出 timer endp dispcha
15、r proc push bx mov ah,14 ;写字符到光标位置,光标位置加1 int 10h pop bx ret dispchar endp code ends end start五、 子程序清单1) 子程序名:timer;功能:判断中断计数是否满100次,若已满对时间做出相应的修改;入口参数:无;出口参数:无;使用寄存器:AX,FR。2) 子程序名:dispchar;功能:写入相应字符至光标位置,并将光标前进一位;入口参数:al,用以存储待写入的字符;出口参数:无;使用寄存器:AX,BX。六、 程序分析1) 本程序一开始利用INT 10H进入BIOS功能调用,通过当前页上滚实现清屏功
16、能,采用用户键入得到现行时钟起始值,利用INT 21H读取用户键盘输入,等待用户正确输入后开始计时;2) 利用8253作为中断源,43H端口是8253三通道定时器中的命令寄存器,所使用的命令字36H表示选用0通道定时器,以3号方式(产生方波)计数。向端口40H送出的计数器初值选用11932是要求8253每秒发出100次时钟中端(08H),将本程序中的timer的起始地址送入中断的入口地址,保证每次发生08H中断时,程序自动进入timer;3) 程序运行的大体过程为:主程序显示时钟值,发生中断08H时进入timer,查看中断计数是否达到100次,若没有达到次数直接退出中断返回主程序;若已达到,则
17、时间又过了1s,对个数据进行修改后返回主程序;4) 本程序的时钟显示范围是00:00:00至23:59:59,因而在计时至23:59:59时,下一秒将时间修改为00:00:00,针对不同的时间改变过程,程序中做了对应的修改,已保证时钟显示无误,在输入过程及刷新显示时对键盘输入进行检测,当输入“CTRL+C”时退出程序。七、 执行结果1) 初始清屏,提示用户输入正确时间:2) 输入错误时提示错误输入:3) 正确输入时开始计时:4) 输入“ctrl+c”时退出程序:八、 实验总结通过本次实验,初步掌握了中断的应用,在编写过程中,出现逐位判断异常,跳转超出范围,中断程序写入异常的问题,通过查阅书本及翻阅相关资料,解决了上述问题。本次实验与之前实验相比难度有所提升,完成程序的过程中对各中断号的应用更为熟练,汇编语言的编写能力逐步提升。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1