10:36:37
今天我用汇编写的在PC机上显示的模拟数字时钟,按1键可以暂停,按2键就可以继续了,按9退去!
哈哈......运行还算稳定!
D_SEG SEGMENT ;数据段
SHOW1 DB 'If you want to suspend time please press 1key!'
SHOW2 DB 'if you want to start time please press 6key!'
SHOW3 DB 'if you want to recede time please press 9key!'
TIME DB 'time:'
HH DB '0'
HL DB '0'
DB ':'
MH DB '0'
ML DB '0'
DB ':'
SH DB '0'
SL DB '0'
DB 's'
OLD_INT_SEG DW 0 ;存储1ch中断入口的段地址
OLD_INT_OFF DW 0 ;存储1ch中断入口的偏移地址
COUNT DB 0 ;18次为1秒
D_SEG ENDS
S_SEG SEGMENT STACK ;堆栈段
DB 250 DUP(0)
S_SEG ENDS
C_SEG SEGMENT ;代码段
ASSUME CS:C_SEG,DS:D_SEG,SS:S_SEG
MAIN PROC FAR ;主程序开始
MOV AX,D_SEG
MOV DS,AX ;数据段初始化
STARTE:
CALL INIT_INT ;初始化中断
;MOV AH,08H ;键盘扫描 1键
;INT 21H
;CMP AL,'1'
;JE SUSPEND
;MOV CX,65535
L1:
MOV AH,08H
INT 21H
CMP AL,'1'
JE SUSPEND
CMP AL,'9'
JE EXIT1
JMP L1
SUSPEND:
CALL RESTORE_INT ;恢复原1ch中断入口
MOV AH,08H ;键盘扫描 9键
INT 21H
CMP AL,'6'
JE STARTE
CMP AL,'9'
JE EXIT1
EXIT1: MOV AX,4C00H ;退出,回到DOS
INT 21H
MAIN ENDP ;主程序结束
INIT_INT PROC NEAR ;初始化中断子程序开始
CLI ;关中断
PUSH DS ;保存DS,因程序中修改了它
MOV AL,1CH
MOV AH,35H
INT 21H
MOV OLD_INT_OFF,BX ;保存原1ch的偏移地址
MOV OLD_INT_SEG,ES ;保存原1ch的段地址
MOV AX,SEG DISP ;安装新中断程序入口地址
MOV DS,AX
MOV DX,OFFSET DISP
MOV AH,25H
MOV AL,1CH
INT 21H
POP DS ;恢复DS
STI
RET
INIT_INT ENDP ;初始化中断子程序结束
RESTORE_INT PROC NEAR ;恢复原中断子程序开始
CLI
MOV DX,OLD_INT_OFF
MOV AX,OLD_INT_SEG
MOV DS,AX
MOV AH,25H
MOV AL,1CH
INT 21H
STI
RET
RESTORE_INT ENDP ;恢复原中断子程序结束
DISP PROC NEAR ;新的1ch中段程序开始
CLI
MOV AX,D_SEG ;为确保访问到字符串,重新指定DS
MOV DS,AX
MOV AX,0B83CH ;显存区地址B8000h~Bffffh,(25行,160列)
MOV ES,AX
INC COUNT
CMP COUNT,18
JE J
BACK: STI
IRET
J:
CALL CLRSC
MOV BX,0 ;在屏幕显示字符
MOV SI,0
MOV CX,2EH
S1: MOV AL,[BX+SHOW1]
MOV ES:[SI+20H],AL
MOV AL,[BX+SHOW2] ;show1有46(2e)个字符
MOV ES:[SI+0A0H+20H] ,AL
MOV AL,[BX+SHOW3]
MOV ES:[SI+140H+20H],AL
ADD BX,1
ADD SI,2
LOOP S1
MOV AL,24H ;字符的属性,如:2h可为绿色
MOV ES:[73H],AL
MOV AL,25H ;字符的属性,如:2h可为绿色
MOV ES:[73H+0A0H],AL
MOV AL,27H ;字符的属性,如:2h可为绿色
MOV ES:[73H+140H],AL
MOV BX,0
MOV SI,0
MOV CX,14
S2: MOV AL,[BX+TIME] ;time的首地址
MOV ES:[SI+280H+30H],AL
INC SI
MOV AL,7CH ;字符的属性,如:2h可为绿色 0fch
MOV ES:[SI+280H+30H],AL
INC BX
INC SI
LOOP S2
INC SL
CMP SL,3AH ;10的ascii码
JNE LP
MOV SL,'0' ;
INC SH
CMP SH,'6'
JNE LP
MOV SH,'0' ;
INC ML
CMP ML,3AH ;10的ascii码
JNE LP
MOV ML,'0' ;
INC MH
CMP MH,'6'
JNE LP
MOV MH,'0' ;
INC HL
CMP HL,'4'
JNE LP
MOV HL,'0' ;
INC HH
CMP HH,'2'
JNE LP
MOV HH,'0' ;超过24h就全部清零
MOV HL,'0'
MOV MH,'0'
MOV ML,'0'
MOV SH,'0'
MOV SL,'0'
LP: ;ADD CX,18
MOV COUNT,0
JMP BACK
CLRSC PROC NEAR
PUSH AX ;清屏子程序
PUSH BX
PUSH CX
PUSH DX
MOV CX,0
MOV DH,25 ;(DH、DL)=窗口的右下角位置(Y坐标,X坐标)
MOV DL,80
MOV BH,7 ;BH=空白区域的缺省属性
MOV AL,0
MOV AH,6
INT 10H
POP DX
POP CX
POP BX
POP AX
RET
CLRSC ENDP
DISP ENDP ;新的1ch中段程序结束
C_SEG ENDS ;代码段结束
END MAIN ;程序结束