-1

它应该显示时间但什么也不做

;  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
4

1 回答 1

0

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

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

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

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

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

lea dx,INITS
add dx,15
shr dx,4
于 2014-01-09T13:26:19.993 回答