2014-01-07 144 views
-1

它应该显示的时间,但什么都不做这个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 
+0

你用什么操作系统?真正的MS-DOS(可能在虚拟机中)或某些MS-DOS模拟器?还要注意,你不应该覆盖中断0x08而是0x1C。你是否已经检查过中断是否被调用?请注意,功能31H DX寄存器中断为0x21包含段落的数量,而不是字节数! –

回答

0

你的程序可能有效,但显示过去视频RAM的输出! 我想你使用的是标准的文本屏幕,80列和25列。 的VRAM开始于0B800h并占据4000个字节。

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

此外,我建议你不要push ss也不pop ss。他们根本不需要。

为什么不考虑使用pushapopa代替所有这些单独的指令?

要正确地终止和驻留用途:

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