北郵微原作業(yè)中斷實驗與編程_第1頁
北郵微原作業(yè)中斷實驗與編程_第2頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、 8/8北郵微原作業(yè)中斷實驗與編程 微原第二次軟件實驗 一、實驗要求 編寫一程序,在顯示器上顯示時、分、秒。具體要求如下: 1)借用計數(shù)器8253的Timer()作為中斷源,通過8259A向CPU發(fā)中斷,每10ms產(chǎn)生 一次中斷; 2)在中斷服務程序中管理刷新時、分、秒; 3)輸入文件名后清屏顯示:Current time is : XX:XX:XX(時、分、秒鍵盤輸入); 4)當鍵入CTRL+C時,停止計時,返回系統(tǒng),且系統(tǒng)正常運行不死機。 二、設計思路 1)數(shù)據(jù)段定義四個字符串,分別用于顯示程序功能、提示用戶輸入,顯示當前時間以 及錯誤格式輸入提示。同時定義六個變量用于存儲當前顯示的的時、

2、分、秒的十位 及個位,一個變量count100用以中斷計數(shù); 2)在BIOS功能調(diào)用中,令AH=6,設置窗口左上角、右下角行列位置使當前頁上滾, 從而實現(xiàn)程序一開始的清屏功能; 3)提示用戶輸入起始時間時,需要對輸入格式進行判斷,嚴格要求輸入在00:00:00 至23:59:59,正確輸入時則存入相應的變量中,輸入任意鍵開始計時,錯誤時則屏 幕顯示輸入錯誤,提示用戶重新進行輸入,若輸入為“CTRL+C”時退出程序; 4)利用8253作為中斷源,輸入控制字36H,時間常數(shù)為11932,使其選用通道0計 數(shù),產(chǎn)生頻率100Hz的方波,即中斷100次時間間隔為1s,時間刷新顯示; 5)8253中斷源

3、每中斷一次,進入timer中斷子程序,將其段基地址及段內(nèi)偏移量存入 中斷向量表,利用8259向CPU發(fā)出中斷; 6)timer子程序會對中斷次數(shù)進行判斷,每中斷滿100次時根據(jù)當前時間進行相應的 時、分、秒修改,若不滿100次時直接退出中斷; 7)屏幕顯示時將時、分、秒的十位和個位分別送人al中,在BIOS功能調(diào)用中令ah=14h, 實現(xiàn)將al中的字符寫到光標位置,并將光標進一,8次循環(huán)直到時鐘完全顯示,同 時比對second,中斷滿100次時,即時間間隔1s時second變化,當檢測到這一變 化時重新進入disp刷新顯示; 8)在每秒變化需要刷新顯示時,都先進行鍵盤輸入判斷,當有輸入且輸入為

4、“ctrl+c” 時,退出程序。 三、程序流程 1)主要程序流程圖 2)中斷程序流程圖 四、源代碼 data segment count100 db100 tenhour db0 hour db0,: tenmin db0 minute db0,: tensec db0 second db0 s1 db(00:00:0023:59:59 Ctrl+C to exit key to start)$ s4 dbStarting time is:$ s2 db(Ctrl+C to exit)Current time is:$ s3 db Error!,0dh,0ah,$ data ends stac

5、k segment stack db256dup(0) stack ends ;回車換行宏定義 CRLF MACRO mov ah,02h mov dl,0dh int21h mov dl,0ah int21h 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;當前顯示頁上滾功能調(diào)用號 int10h;I/O中斷調(diào)用 begin: mov dx,offset s1 mov ah,09h;程序提示 int21h CRLF mov dx,offset s4 mov ah,09h;提示輸入 int21h mov bp,0;分輸入正確后加一,跳轉(zhuǎn)為秒輸入判斷mov di,offset tenhour mov ah,01h int21h cmp al,03h jnz goon1 ;讀取第一位,不為ctrl+c則繼續(xù)鍵入mov ah,4ch int21h goon1: mov bl,0;第一位為0到2 cmp al,bl jl

7、tiaoban mov bl,2 cmp al,bl jg tiaoban movdi,al;存入tenhour mov bh,al inc di mov ah,01h int21h cmp al,03h jnz goon2 ;讀取第二位,不為ctrl+c則繼續(xù)鍵入mov ah,4ch int21h 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 movdi,al;存入hour jmp nextchar tiaoban:

8、jmp error ;用于跳轉(zhuǎn) tenhour2: mov bl,0 cmp al,bl jl error mov bl,3 cmp al,bl jg error movdi,al nextchar: inc di mov ah,01h int21h cmp al,03h jnz goon3 ;讀取第三位,不為ctrl+c則繼續(xù)鍵入mov ah,4ch int21h goon3: mov bl,:;第三位為: cmp al,bl jne error inc di mov ah,01h int21h cmp al,03h jnz goon4 ;讀取第四位,不為ctrl+c則繼續(xù)鍵入mov ah,

9、4ch int21h goon4: mov bl,0;分、秒均為00-59 cmp al,bl jl error mov bl,5 cmp al,bl jg error movdi,al;存入tenmin或tensec inc di mov ah,01h int21h cmp al,03h jnz goon5 ;讀取第五位,不為ctrl+c則繼續(xù)鍵入mov ah,4ch int21h goon5: mov bl,0 cmp al,bl jl error mov bl,9 cmp al,bl jg error movdi,al;存入minute或second inc bp cmp bp,1;bp

10、為1則繼續(xù)讀取秒鐘輸入 je nextchar signal: mov ah,0bh;輸入任意鍵開始計時 int21h or al,al jz signal ;無輸入繼續(xù)檢測,有輸入才開始 CRLF ;換行回車 jmp init error:mov dx,offset s3 mov ah,09h int21h;顯示錯誤提示信息 JMP begin ;重新讀取 init: cli;關(guān)中斷 mov ax,0 mov es,ax;置附加段基地址為0 mov di,20h;中斷號08h*4 mov ax,offset timer ;中斷程序的段內(nèi)偏移量 stosw;偏移量存入中斷向量表 mov ax,

11、cs;中斷程序段基地址 stosw;段基地址存入中斷向量表 mov al,36h;選用0通道計數(shù)器,采用3號方式(方波)計數(shù)out43h,al mov bx,11932;時間常數(shù),輸出100HZ方波 mov al,bl out40h,al mov al,bh out40h,al mov al,0fch out21h,al;21h端口為中斷屏蔽寄存器,用以開發(fā)外部中斷 sti;開中斷 ;屏幕顯示當前時間,變化時刷新顯示 disp: mov ah,0bh int21h or al,al jz noexit ;系統(tǒng)無輸入時不退出 mov ah,08h int21h cmp al,03h jnz no

12、exit mov ah,4ch int21h noexit: mov dx,offset s2 mov ah,09h int21h 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 ;無變化時循環(huán) jmp disp ;有變化時刷新顯示 ;中斷一百次即為1s,時間相應變化 timer proc fa

13、r 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 ;與秒同理 cmp minute,9 jle timerx mov minute,0 inc tenmin cmp tenmin,6 j

14、l 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 out20h,al pop ax iret;中斷退出 timer endp dispchar proc push bx mov ah,14;寫字符到光標位置,光標位置加1 int10h pop bx ret disp

15、char endp code ends end start 五、子程序清單 1)子程序名:timer; 功能:判斷中斷計數(shù)是否滿100次,若已滿對時間做出相應的修改; 入口參數(shù):無; 出口參數(shù):無; 使用寄存器:AX,F(xiàn)R。 2)子程序名:dispchar; 功能:寫入相應字符至光標位置,并將光標前進一位; 入口參數(shù):al,用以存儲待寫入的字符; 出口參數(shù):無; 使用寄存器:AX,BX。 六、程序分析 1)本程序一開始利用INT 10H進入BIOS功能調(diào)用,通過當前頁上滾實現(xiàn)清屏功能, 采用用戶鍵入得到現(xiàn)行時鐘起始值,利用INT 21H讀取用戶鍵盤輸入,等待用戶正 確輸入后開始計時; 2)利用

16、8253作為中斷源,43H端口是8253三通道定時器中的命令寄存器,所使用的 命令字36H表示選用0通道定時器,以3號方式(產(chǎn)生方波)計數(shù)。向端口40H 送出的計數(shù)器初值選用11932是要求8253每秒發(fā)出100次時鐘中端(08H),將本 程序中的timer的起始地址送入中斷的入口地址,保證每次發(fā)生08H中斷時,程序 自動進入timer; 3)程序運行的大體過程為:主程序顯示時鐘值,發(fā)生中斷08H時進入timer,查看中 斷計數(shù)是否達到100次,若沒有達到次數(shù)直接退出中斷返回主程序;若已達到,則 時間又過了1s,對個數(shù)據(jù)進行修改后返回主程序; 4)本程序的時鐘顯示范圍是00:00:00至23:59:59,因而在計時至23:59:59時,下一秒 將時間修改為00:00:00,針對不同的時間改變過程,程序中做了對應的修改,已保

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論