📄 xie3.asm
字号:
;--------------------------------------------------
DIS MACRO STR,ROW,DDL,CCX
MOV BP,OFFSET STR
MOV DH,ROW
MOV DL,DDL
MOV CX,CCX
MOV BX,0014H
MOV AX,1300H
INT 10H
ENDM
;--------------------------------------------------
CHECK MACRO STR
LOCAL NONE
PUSH DX
CMP DH,STR
JNZ NONE
CMP DL,STR[1]
JNZ NONE
DIS STR[2],ROW,46H,10
INC ROW
NONE: POP DX
ENDM
;---------------------------------------------------
;***************************************************
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
COUNT_VAL = 18
COUNT DW COUNT_VAL
OLD1CH DD ?
ROW DB 0
DATE DB 13 DUP ('/'),20 DUP (' ')
TIME DB 8 DUP (':'),20 DUP (' ')
STR0 DB 'nobody',5 DUP(' ')
STR1 DB 01,21,'chentianci'
STR2 DB 01,27,'xiejun', 6 DUP(' ')
STR3 DB 01,26,'xiecan', 8 DUP(' ')
STR4 DB 01,24,'xiechao',8 DUP(' ')
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 BP
PUSH CS
POP DS
PUSH DS
POP ES
CALL getDate
CALL getTime
CALL CHECK_ALL
POP BP
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
JMP DWORD PTR CS:OLD1CH ;恢复 INT 1CH
;--------------------------------------------------------
getDate PROC NEAR
MOV AH,2AH ;
INT 21H
MOV SI,0
PUSH AX ;week
MOV BX,100
MOV AX,CX
DIV BL
MOV BL,AH
CALL HEXASC ;
MOV AL,BL
CALL HEXASC
INC SI
MOV AL,DH
CALL HEXASC
INC SI
MOV AL,DL
CALL HEXASC
INC SI
POP AX
CALL HEXASC
DIS DATE,00H,43H,13
RET
getDate ENDP
;--------------------------------------------------------
getTime PROC
MOV AH,02H
INT 1AH
MOV SI,0
MOV AL,CH
CALL BCDASC ;
INC SI
MOV AL,CL
CALL BCDASC
INC SI
MOV AL,DH
CALL BCDASC
DIS TIME,00H,3aH,8
RET
getTime ENDP
;--------------------------------------------------------
CHECK_ALL PROC
MOV AH,2AH ;
INT 21H
MOV ROW,1
CHECK STR1
CHECK STR2
CHECK STR3
CHECK STR4
CMP ROW,1
JNE BACK
DIS STR0,ROW,46H,10
BACK: RET
CHECK_ALL ENDP
;--------------------------------------------------------
HEXASC PROC ;
PUSH BX
MOV AH,0
MOV BX,10
DIV BL
ADD AX,3030H
MOV WORD PTR DATE[SI],AX
ADD SI,2
POP BX
RET
HEXASC ENDP
;-------------------------------------------------------
BCDASC PROC
MOV AH,AL
AND AL,0FH
SHR AH,1
SHR AH,1
SHR AH,1
SHR AH,1
ADD AX,3030H
XCHG AH,AL
MOV WORD PTR TIME[SI],AX
ADD SI,2
RET
BCDASC ENDP
;--------------------------------------------------------
MAIN PROC FAR
START:
PUSH CS
POP DS
MOV AX,351CH ;取 INT 1CH 的地址
INT 21H ; 存入ES:BX
MOV WORD PTR OLD1CH,BX;并保存它
MOV WORD PTR OLD1CH+2,ES
MOV DX,OFFSET NEW1CH
MOV AX,251CH ;为 INT 1CH
INT 21H ; 设置新地址为TEST
MOV DX,OFFSET START ;设置大小
ADD DX,15
MOV CL,4
SHR DX,CL
ADD DX,10H
MOV AX,3100H ;请求保存常驻
INT 21H
MAIN ENDP
;**********************************************************
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -