📄 mm.txt
字号:
求高手帮我修改系统时钟汇编语言代码!!!!!
CURSOR EQU 45H
ATTRIB EQU 2FH
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:
JMP GO
OLDCUR DW ?
OLD1C DW 2 DUP(?)
NEWINT1C:
PUSHF
CALL DWORD PTR CS:OLD1C
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR BH,BH
MOV AH,3
INT 10H
MOV CS:OLDCUR,DX
MOV AH,2
XOR BH,BH
MOV DX,CURSOR
INT 10H
MOV AH,2 ;读取系统时钟
INT 1AH
PUSH DX
PUSH CX
POP BX
PUSH BX
CALL SHOWBYTE
CALL SHOWCOLON
POP BX
XCHG BH,BL
CALL SHOWBYTE
CALL SHOWCOLON
POP BX
CALL SHOWBYTE
MOV DX,CS:OLDCUR
MOV AH,2
XOR BH,BH
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET
SHOWBYTE PROC NEAR
PUSH BX
MOV CL,4
MOV AL,BH
SHR AL,CL
ADD AL,30H
CALL SHOW
CALL CURMOVE
POP BX
MOV AL,BH
AND AL,0FH
ADD AL,30H
CALL SHOW
CALL CURMOVE
RET
SHOWBYTE ENDP
SHOWCOLON PROC NEAR
MOV AL,':'
CALL SHOW
CALL CURMOVE
RET
SHOWCOLON ENDP
CURMOVE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,3
MOV BH,0
INT 10H
INC DL
MOV AH,2
INT 10H
POP DX
POP CX
POP BX
POP AX
RET
CURMOVE ENDP
SHOW PROC NEAR
PUSH AX
PUSH BX
PUSH CX
MOV AH,09H
MOV BX,ATTRIB
MOV CX,1
INT 10H
POP CX
POP BX
POP AX
RET
SHOW ENDP
GO:
PUSH CS
POP DS
MOV AX,351CH ;取中断向量
INT 21H
MOV OLD1C,BX ;保存原中断向量
MOV BX,ES
MOV OLD1C+2,BX
MOV DX,OFFSET NEWINT1C ;置新的中断向量
MOV AX,251CH
INT 21H
MOV DX,OFFSET GO
SUB DX,OFFSET START
MOV CL,4
SHR DX,CL
ADD DX,11H
MOV AX,3100H ;结束并驻留
INT 21H
CODE ENDS
END START
................................................
...............................................
COUNT_VAL =18 ;间隔“滴答”数
DPAGE =0 ;显示页号
ROW =23 ;显示时钟的行号
COLUMN =80-BUFF_LEN ;显示时钟的开始列号
COLOR =07H ;显示时钟的属性值
;代码
CSEG SEGMENT
ASSUME CS:CSEG,DS:CSEG
;1CH号中断处理程序使用的变量
COUNT DW COUNT_VAL;“滴答”计数
HHHH DB ?,?,':' ;时
MMMM DB ?,?,':' ;分
SSSS DB ?,? ;秒
BUFF_LEN = $-OFFSET HHHH ;BUFF_LEN为显示信息长度
CURSOR DW ?
OLD1CH DD ?
OLD53 DW ?
;1CH号中断处理程序代码
NEW1CH: CMP CS:COUNT,0 ;是否已到显示时候?
JZ NEXT ;是,转
DEC CS:COUNT ;否
JMP DWORD PTR CS:OLD1CH
;
NEXT:
MOV CS:COUNT,COUNT_VAL ;重置间隔数的初值
STI
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH CS
POP DS ;置数据段寄存器
PUSH DS
POP ES ;置代码段寄存器
CALL GET_T ;取时间
; MOV BH,DPAGE
; MOV AH,3 ;取原光标位置
; INT 10H
; MOV CURSOR,DX ;保存原光标位置
MOV CX,BUFF_LEN
MOV SI,OFFSET HHHH
MOV AX,0B800H
MOV ES,AX
MOV DI,1992*2
MOV Ah,7
SHOW: MOV Al,[SI]
MOV ES:[DI],AX
INC SI
INC DI
INC DI
LOOP SHOW
; MOV BH,DPAGE ;恢复原光标
; MOV DX,CURSOR
; MOV AH,2
; INT 10H
; MOV BP,OFFSET HHHH
; MOV BH,DPAGE
; MOV DH,ROW
; MOV DL,COLUMN
; MOV BL,COLOR
; MOV CX,BUFF_LEN
; MOV AL,0
; MOV AH,13H ;显示时钟
; INT 10H
POP DI ;恢复现场
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
; IRET ;中断返回
JMP DWORD PTR CS:OLD1CH
;
;子程序说明信息略
GET_T PROC
MOV AH,2 ;取时间信息
INT 1AH
MOV AL,CH ;把时数转为可显示形式
CALL TTASC
XCHG AH,AL
MOV WORD PTR HHHH,AX ;保存
MOV AL,CL ;把分数转为可显示形式
CALL TTASC
XCHG AH,AL
MOV WORD PTR MMMM,AX ;保存
MOV AL,DH ;把秒数转为可显示形式
CALL TTASC
XCHG AH,AL
MOV WORD PTR SSSS,AX ;保存
RET
GET_T ENDP
;
;子程序名:TTASC
;功能:把两位压缩的BCD码转换为对应的ASCII码
;入口参数:AL=压缩BCD码
;出口参数:AH=高位BCD码所对应的ASCII码
; AL=低位BCD码所对应的ASCII码
TTASC PROC
MOV AH,AL
AND AL,0FH
SHR AH,1
SHR AH,1
SHR AH,1
SHR AH,1
ADD AX,3030H
RET
TTASC ENDP
;===========================
;初始化部分代码和变量
;OLD1CH DD ? ;原中断向量保存单元
;EXIT: LDS DX,OLD1CH ;取保存的原1CH号中断向量
; MOV AX,251CH
; INT 21H ;恢复原1CH号中断向量
; MOV AL,35H
; OUT 43H,AL
; MOV AX,OLD53
; OUT 43H,AL
; MOV AL,AH
; OUT 43H,AL
; MOV AX,4C00H
; INT 21H
START:
MOV AL,0
OUT 43H,AL
IN AL,40H
MOV AH,AL
IN AL,40H
XCHG AL,AH
MOV OLD53,AX
MOV AL,34H
OUT 43H,AL
MOV BX,11932
MOV AL,BL
OUT 40H,AL
MOV AL,BH
OUT 40H,AL
PUSH CS
POP DS
MOV AX,351CH ;取1CH号中断向量
INT 21H
MOV WORD PTR OLD1CH,BX;保存
MOV WORD PTR OLD1CH+2,ES
MOV DX,OFFSET NEW1CH
MOV AX,251CH ;置新的1CH号中断向量
INT 21H
MOV DX,OFFSET START
ADD DX,15
MOV CL,4
SHR DX,CL
ADD DX,10H
MOV AH,31H
; MOV AH,0BH
; INT 21H
; CMP AL,00H
; JNZ EXIT
; MOV AH,0 ;假设其他工作是等待按键
; INT 16H
; MOV AH,4CH ;结束
INT 21H
CSEG ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -