这个TSR怎么了?

时间:2014-01-07 20:21:13

标签: assembly tsr

它应显示时间但不执行任何操作

;  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

1 个答案:

答案 0 :(得分:0)

您的程序可能有效,但输出显示在视频RAM之外! 我想你正在使用80列25行的标准文本屏幕。 VRAM从0B800h开始,占用4000字节。

您的意思是要清除50列25行的窗口吗?您的评论建议您清除屏幕。

此外,我建议您不要push sspop ss。根本不需要它们。

为什么不考虑使用pushapopa而不是所有这些单独的指示?

正确终止并保持居民使用:

lea dx,INITS
add dx,15
shr dx,4