2014-01-07 3 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

당신이 어떤 OS를 사용 하는가를? 실제 MS-DOS (어쩌면 가상 컴퓨터에서) 또는 일부 MS-DOS 에뮬레이터? 또한 인터럽트 0x08을 덮어 쓰지 말고 0x1C를 덮어 써서는 안됩니다. 인터럽트가 전혀 호출되지 않았는지 이미 확인 했습니까? 인터럽트 0x21에 대한 함수 31h의 DX 레지스터에는 바이트 수가 아니라 단락 수가 포함되어 있습니다. –

답변

0

프로그램이 아마 작동하지만 출력이 비디오 램을지나 표시됩니다! 80 열 25 행의 표준 텍스트 화면을 사용한다고 가정 해 보겠습니다. VRAM은 0B800h에서 시작하여 4000 바이트를 차지합니다.

50 열 x 25 행의 창을 지우셨습니까? 귀하의 의견은 화면을 지울 것을 제안합니다.

push ss도 아니고 pop ss도 좋습니다. 그들은 단순히 필요하지 않습니다.

모든 별도의 지침 대신 pushapopa을 사용하지 않으시겠습니까?

올바르게 종료하고 상주 사용을 유지하려면

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