它应显示时间但不执行任何操作
; PROGRAM FOR TSR FOR CLOCK
.MODEL TINY
.CODE
ORG 100H
START:
JMP INITS ;Jump to initialization portion
ADRS DD ?
TIME1:
PUSH AX
PUSH BX
PUSH CX
PUSH DX ;Save registers
PUSH SI
PUSH DI
PUSH DS
PUSH SS
PUSH ES
PUSHF
MOV AX,0B900H
MOV ES,AX ;Load VRAM address
MOV DI,820
MOV AH,02 ;Get current time
INT 1AH
MOV AL,CH
SHR AL,04 ;Hours in CH
ADD AL,30H
MOV ES:[DI],AL
ADD DI,02
MOV AL,CH
AND AL,0FH
ADD AL,30H
MOV ES:[DI],AL
ADD DI,02
MOV AL,':'
MOV ES:[DI],AL
ADD DI,02
MOV AL,CL ;Minutes in CL
SHR AL,04
ADD AL,30H
MOV ES:[DI],AL
ADD DI,02
MOV AL,CL
AND AL,0FH
ADD AL,30H
MOV ES:[DI],AL
ADD DI,02
MOV AL,':'
MOV ES:[DI],AL
ADD DI,02
MOV AL,DH ;Seconds in DH
SHR AL,04H
ADD AL,30H
MOV ES:[DI],AL
ADD DI,02
MOV AL,DH
AND AL,0FH
ADD AL,30H
MOV ES:[DI],AL
ADD DI,02
EXIT:
POPF
POP ES
POP SS
POP DS
POP DI ;Restore the registers
POP SI
POP DX
POP CX
POP BX
POP AX
JMP DWORD PTR CS:ADRS ;Jump to restore original address of
;Interrupt in IVT
INITS:
MOV AL,00H ;Clear screen
MOV AH,06H
MOV BH,07H
MOV CX,0000H
MOV DX,1832H
INT 10H
CLI
PUSH CS
POP DS
MOV AH,35H ;Get interrupt address of int 08h
MOV AL,08
INT 21H
MOV WORD PTR ADRS,BX
MOV WORD PTR ADRS+2,ES
MOV AH,25H ;Set new address of int 08 h
MOV AL,08
LEA DX,TIME1
INT 21H
MOV AH,31H ;Request stay resident
LEA DX,INITS ;Load the no. of paragraphs of resident portion
STI ;Restore interrupts
INT 21H
END START
答案 0 :(得分:0)
您的程序可能有效,但输出显示在视频RAM之外! 我想你正在使用80列25行的标准文本屏幕。 VRAM从0B800h开始,占用4000字节。
您的意思是要清除50列25行的窗口吗?您的评论建议您清除屏幕。
此外,我建议您不要push ss
或pop ss
。根本不需要它们。
为什么不考虑使用pusha
和popa
而不是所有这些单独的指示?
正确终止并保持居民使用:
lea dx,INITS
add dx,15
shr dx,4