?? clock.asm
字號:
; 程序說明
; 這是一個在ms-dos下在屏幕右上角顯示時鐘的程序。
; 程序實現了BISO功能調用讀取實時時鐘,并把程序
; 駐留內存,利用1CH中斷實現電子鐘計數。
; 本程序在masm 5.0下匯編通過,并且在ms-dos下
; 運行良好,實現了內存駐留,在dos做其他操作,
; 屏幕右上方始終顯示一個綠色時間。
; 由于時間有限,不能改善程序,本想直接修改
; 顯存來定位和顯示時鐘。
; 作者:
;
;
; 2007,11,7
code segment
assume ds:code,cs:code,es:code,ss:code
org 100h
main proc near
jmp init
timer dw 18 ;計數值,每18次為1秒鐘
correct db 0 ; 修正值,每 5*18=90 次要修正一次timer
str db "00:00:00" ;時鐘字符串
n1c:
;保護現場
PUSH ax
PUSH bx
PUSH cx
PUSH dx
PUSH si
PUSH di
PUSH bp
PUSH sp
PUSH es
PUSH ds
PUSH cs ;寫數據段,使代碼段和數據段一致
POP ds
STI ;關中斷
DEC timer ; 1秒計數值-1
JZ time ; 十八次中斷為一秒鐘,轉移到計數代碼
JMP exit ;不足一秒退出中斷
time:
MOV timer,18 ;重置計數值
INC str[7] ;秒鐘的個位加 1
CMP str[7],'9' ;
JBE disp
MOV str[7],'0' ;個位清零
INC str[6] ;秒鐘十位進位
CMP str[6],'6'
JB disp
MOV str[6],'0' ;
INC str[4] ;分鐘的個位加 1
CMP str[4],'9'
JBE disp
MOV str[4],'0'
INC str[3] ;分鐘十位進位
CMP str[3],'6'
JB disp
MOV str[3],'0'
INC str[1] ;時鐘個位加 1
CMP str[1],'9'
JBE hour
MOV str[1],'0'
INC str[0] ;時鐘十位進位
hour:
CMP str[0],'2'
JNE disp ;判斷是否時鐘十位為2
CMP str[1],'4' ;時鐘十位為2,判斷個位是否為4
JNE disp
MOV str[0],'0' ;24 小時,重新計數
MOV str[1],'0'
disp: ;顯示時鐘在屏幕右上角
; BIOS 13H 功能調用ES:BP=串地址CX=串長度,DH,DL=起始行列
;BH=頁號,AL=1光標返回起始位置,BL=屬性
MOV ax,cs
MOV es,ax ;把數據段(和代碼段相同)放到es
MOV bp,offset str ;字符串偏移地址放到bp
MOV cx,8 ;字符串長度為8
MOV dh,0 ;第0行
MOV dl,71d ;第71列顯示
MOV bl,0ah ;字符屬性為綠色
MOV bh,0 ;在第0頁上顯示
MOV al,0 ;設置光標返回
MOV ah,13h ;調用BIOS 10H類型,13H功能中斷顯示字符串
INT 10h
INC correct ;修正值加1
CMP correct,5
JNE exit
INC timer ; 每5秒有5*18.2=91次中斷,而現在才5*18=90次中斷就電子鐘有5秒
;所以快了一次中斷時間,修正timer計數值,讓它多計算一次中斷
MOV correct,0
exit:
CLI ;開中斷
;恢復現場
POP ds
POP es
POP sp
POP bp
POP di
POP si
POP dx
POP cx
POP bx
POP ax
IRET ;中斷返回
init:
;int 27h 中斷要求駐留內存的程序大小不能超過64k
;并且如果cs和ds不相同時,程序執行會失敗
PUSH cs ;寫數據段
POP ds
PUSH AX
PUSH CX
PUSH DX
MOV ah, 02h ;調用BIOS 功能讀取實時時鐘
INT 1ah ;CH 小時數(BCD碼)
;MOV ax, 0eh ;CL 分鐘數(BCD碼)
;DH 秒數(BCD碼)
MOV str[0],CH ;把實時時鐘存到字符串
MOV str[1],CH
MOV str[3],CL
MOV str[4],CL
MOV str[6],DH
MOV str[7],DH
MOV CL,4 ;把時鐘轉化為ASCII碼
SHR str[0],CL
ADD str[0],30H
AND str[1],0FH
ADD str[1],30H
SHR str[3],CL
ADD str[3],30H
AND str[4],0FH
ADD str[4],30H
SHR str[6],CL
ADD str[6],30H
AND str[7],0FH
ADD str[7],30H
POP DX
POP CX
POP AX
MOV dx,offset n1c ;中斷程序入口地址
MOV ax,251ch ;寫中斷向量1CH
INT 21h
MOV ax,offset init ;
MOV dx,ax ;DX 為保持長駐程序最后一個字節
INT 27h ;程序駐留及退出
main endp
code ends
end main
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -