📄 js.asm
字号:
;第一部分
;功能:⑴修改1c号中断向量
; ⑵新的1c中断服务程序将当前时间存入coms中
;第二部分
;功能:⑴取上次关机时、分、秒;
; ⑵取本次开机日期、时间;
; ⑶存入 c:\timercd.sys 。
;日期:1990.07.22,93.11.24
COSEG SEGMENT
ORG 100H ; .COM 格式
ASSUME CS:COSEG,DS:COSEG
START: JMP START1
OFFSET1C DW 0000H ;放原1C中断入口偏移量
SEG1C DW 0000H ;放原1C中断入口段地址
LIR PROC FAR ;新的1c中断服务程序
PUSH AX ;保护现场
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
PUSHF
CALL DWORD PTR CS:OFFSET1C ;调原来 1C 中断
CLI ;禁止中断
MOV AH,02H
INT 1AH ;读当前实时钟(CH时CL分DH秒,BCD码)
PUSH DX ;保存DH值
MOV DX,70H ;COMS索引寄存器地址
MOV AL,01H
OUT DX,AL ;选择秒报时寄存器
INC DX
POP AX
XCHG AH,AL ;当前秒=>AL
OUT DX,AL ;存入秒报时寄存器
MOV DX,70H
MOV AL,03H
OUT DX,AL ;选择分报时寄存器
INC DX
MOV AL,CL ;分
OUT DX,AL ;存入分报时寄存器
MOV DX,70H
MOV AL,05H
OUT DX,AL ;选择时报时寄存器
INC DX
MOV AL,CH ;时
OUT DX,AL ;存入时报时寄存器
STI ;开中断
POP ES ;恢复现场
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
IRET
LIR ENDP
FILENAME DB "C:\TIMERCD.SYS",00H ;文件名
BEGINTM DB 14 DUP(0) ;本次开机日期、时间
ENDTM DB 6 DUP(0),0DH,0AH ;上次关机时间
STOH PROC NEAR
MOV AX,CS
MOV DS,AX
MOV ES,AX ;使ds=es=cs
MOV BX,OFFSET ENDTM ;关机时间缓冲区
MOV DX,70H
MOV AL,05
OUT DX,AL ;选择时报时寄存器
INC DX
IN AL,DX ;取关机时
CALL BCDTOASC ;bcd码转换为ascii码
MOV [BX+0],DH
MOV [BX+1],DL
MOV DX,70H
MOV AL,03
OUT DX,AL ;选择分报时寄存器
INC DX
IN AL,DX ;取关机分
CALL BCDTOASC ;bcd码转换为ascii码
MOV [BX+2],DH
MOV [BX+3],DL
MOV DX,70H
MOV AL,01
OUT DX,AL ;选择秒报时寄存器
INC DX
IN AL,DX ;取关机秒
CALL BCDTOASC ;bcd码转换为ascii码
MOV [BX+4],DH
MOV [BX+5],DL
MOV BX,OFFSET BEGINTM ;开机日期时间缓冲区
MOV AH,4
INT 1AH ;取当前日期
PUSH DX
MOV AL,CH ;世纪
CALL BCDTOASC
MOV [BX+0],DH
MOV [BX+1],DL
MOV AL,CL ;年
CALL BCDTOASC
MOV [BX+2],DH
MOV [BX+3],DL
POP DX
MOV AL,DH ;月
PUSH DX
CALL BCDTOASC
MOV [BX+4],DH
MOV [BX+5],DL
POP DX
MOV AL,DL ;日
CALL BCDTOASC
MOV [BX+6],DH
MOV [BX+7],DL
MOV AH,02
INT 1AH ;读当前实时钟
PUSH DX
MOV AL,CH ;时
CALL BCDTOASC
MOV [BX+8],DH
MOV [BX+9],DL
MOV AL,CL ;分
CALL BCDTOASC
MOV [BX+10],DH
MOV [BX+11],DL
POP DX
MOV AL,DH ;秒
CALL BCDTOASC
MOV [BX+12],DH
MOV [BX+13],DL
MOV AH,3DH
MOV AL,1
LEA DX,FILENAME
INT 21H ;打开文件,写
MOV BX,AX ;存文件标记
MOV CX,0
MOV DX,0
MOV AL,2
MOV AH,42H
INT 21H ;指针移到文件尾
MOV AH,40H
MOV CX,8
LEA DX,ENDTM
INT 21H ;上次关机时间存入文件
MOV CX,14
MOV AH,40H
LEA DX,BEGINTM
INT 21H ;本次开机日期、时间存入文件
MOV AH,3EH
INT 21H ;关闭文件
RET
STOH ENDP
;bcd码转换为ascii码子程序
;调用参数:AL(两位bcd码)
;返回参数:DH(高位),DL(低位)
BCDTOASC PROC NEAR
PUSH CX
MOV CL,AL
AND AL,0FH
OR AL,30H
MOV DL,AL ;低位
MOV AL,CL
MOV CL,04H
SHR AL,CL
OR AL,30H
MOV DH,AL ;高位
POP CX
RET
BCDTOASC ENDP
START1: CALL STOH
MOV AX,0000H ;指定段地址
MOV DS,AX
CLI ;关中断
MOV AX,WORD PTR DS:[0070H]
MOV WORD PTR CS:OFFSET1C,AX ;(1CH*4=70H)
MOV AX,WORD PTR DS:[0072H] ;原IC中断段地址转移
MOV WORD PTR CS:SEG1C,AX
MOV WORD PTR DS:[0070H],OFFSET LIR
MOV WORD PTR DS:[0072H],CS
STI ;开中断
LEA DX,FILENAME ;自由空间首址
INT 27H ;驻留内存
COSEG ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -