;程式用途:利用windows 1ch 提供使用者中斷 自製時鐘 並能正常運行DOS程式 *
;程式作者:湖北師範學院電腦科學與技術學院 0801班 王定橋 *
;核心演算法:取並儲存原中斷 建立新中段 讀取時間並駐留記憶體後退出 依次執行原、新中段顯示時間 返回中段 *
;製作時間:2010-10-25 *
;程式著作權:代碼公開供學習交流使用,但不得全部引用;若要使用,請先仔細理解後自己製作 *
;附加說明:此程式系作業系統實驗的一個實驗 *
;主要參考:IBM-PC組合語言程式設計 淮海工學院 劉晶亮 微機原理與介面技術系統駐留時間設計 * *
;**********************************************************************************************************
codesg segment ;程式僅用程式碼片段來描述assume ds:codesg,cs:codesgmain proc far start: push ds sub ax,ax push ax mov ax,codesg mov ds,ax;---------------------------------取1ch原來的中斷向量並儲存 mov al,1ch mov ah,35h int 21h mov oldint, bx mov bx, es mov oldint+2,bx;---------------------------------重設1ch中斷向量 mov dx,offset updtime mov ax,seg updtime mov ds,ax mov al,1ch mov ah,25h int 21h ;---------------------------------取目前時間並儲存 mov ah,2ch int 21h mov hour,ch mov min,cl mov sec ,dh;---------------------------------程式駐留記憶體並退出 mov ah,31h mov al,0 mov dx,((prog_len+15)/16)+16 ;計算駐留位元組 int 21h main endp;--------------------------------------------------------新中斷部分updtime proc near;---------------------------------先執行原來的中斷的內容 pushf call dword ptr cs:oldint;---------------------------------開始執行新添加的內容 push ax ;---------- 保護寄存器 push bx push cx push dx;---------------------------------利用ds寄存器指明儲存的資料的地址 mov ax,codesg mov ds,ax;---------------------------------處理時間的顯示和進位部分 dec count jnz exit ;時間未到一秒鐘不用進位,繼續中斷 add sec,1 ;----------處理秒 cmp sec,60 jnz docnt ;時間未到一分鐘不用進位,繼續中斷 mov sec,0 add min,1 ;----------處理分 cmp min,60 jnz docnt ;時間未到一小時不用進位,繼續中斷 mov min,0 add hour,1 ;----------處理時 cmp hour ,24 jnz docnt ;時間未到24時不用進位,繼續中斷 mov hour,0 docnt: mov count,18 ;時間到了一秒時重設計數器 call timeshow ;僅在1秒到了時更新時間,未到時不更新 exit: ;--------------------------返回中斷 pop dx ;---------- 恢複寄存器 pop cx pop bx pop ax iretupdtime endp;--------------------------------------------------------timeshow proc near ;---------------根據時間在螢幕顯示;---------------------------------讀取當前游標位置並存貯 xor bh,bh mov ah,03h int 10h mov cur,dx;---------------------------------置游標為合適位置 xor bh,bh mov dh,0 mov dl,71 mov ah,02 int 10h;---------------------------------顯示小時 sub bx,bx mov bl,hour call bindec ;調用2位十進位數字顯示子程式 call semi ;調用分號顯示子程式;---------------------------------顯示分鐘 sub bx,bx mov bl,min call bindec call semi ;---------------------------------顯示秒鐘 sub bx,bx mov bl,sec call bindec;---------------------------------恢複游標 xor bh,bh mov dx,cur mov ah,02h int 10h ret timeshow endp;--------------------------------------------------------顯示2位十進位的數字bindec proc near mov cx,10 call dec_div ;轉化2位十進位數字時先除10求十位 call curmove mov cx,1 call dec_div ;轉化2位十進位數字時再除1求個位 call curmove retbindec endp;--------------------------------------------------------將2位十進位數字轉化為1位十進位數來顯示dec_div proc near mov ax,bx mov dx,0 div cx ;根據cx中內容作除法 mov bx,dx push bx add al,30h ;顯示商的大小 xor bh,bh mov bl,41h mov ah,09h mov cx,1 int 10h pop bx ;將餘數保留以便下次計算出個位元字 retdec_div endp;--------------------------------------------------------顯示分號semi proc near mov al,':' xor bh,bh mov bl,41h mov ah,09h mov cx,1 int 10h call curmove ret semi endp;--------------------------------------------------------帶顏色顯示字元時移動游標curmove proc near mov ah,03 int 10h inc dl mov ah,02 int 10h retcurmove endp;--------------------------------------------------------所要儲存和使用的資料 ;------------儲存舊的向量 oldint dw 2 dup (?) ;------------計時參數 count dw 18 hour db 0 min db 0 sec db 0 ;------------游標參數 cur dw 0 ;---------------- prog_len equ $-main codesg endsend start
***********************************************************************************************
運行效果:
本文對應程式:http://download.csdn.net/detail/ziyuanxiazai123/2791641