汇编 实时显示系统时间 年月日信息

来源:互联网 发布:粉笔直播课淘宝 编辑:程序博客网 时间:2024/05/18 23:52

编写一个程序,在屏幕上实时地显示日期和时间(例如:2007-4-12 153258显示为332:20 P.M. Saturday,April 12,2007)直到任意一个键被按下才退出程序。 

 
showyear macro char
 push ax
 push si
 push cx
 push dx
 push bx
 push di
        mov     ax,char
        mov     si, offset divisors
        mov     di, offset results                    
        mov     cx,5  
aa:
        mov     dx,0           
        div     word ptr [si]   ;除法指令的被除数是隐含操作数,此处为dx:ax,商ax,余数dx
        add     al,48           ;商加上48即可得到相应数字的ASCII码
        mov     byte ptr [di],al       
        inc     di                               
        add     si,2                          
        mov     ax,dx                       
        loop    aa
        mov     cx,4   
        mov     di, offset results
bb:
        cmp     byte ptr [di],'0'   ;不输出前面的0字符   
        jne     print
        inc     di                          
        loop    bb
print:
        mov     dx,di                      
        mov     ah,9
        int     21h 
       
        pop di
        pop bx
        pop dx
        pop cx
        pop si
        pop ax
endm

DISP MACRO CHAR  ;显示字符
 PUSH AX
 PUSH DX
 
 MOV DL,CHAR 
 MOV AH,2
 INT 21H

 POP DX
 POP AX
ENDM

GETNUM MACRO CHAR ;显示数字
PUSH AX
PUSH DX
PUSH CX
 MOV AL,CHAR
 AAM
 MOV DH,AL
 MOV DL,AH
 OR DL,30H
 MOV AH,2
 INT 21H 
 
 MOV DL,DH
 OR DL,30H
 
 MOV AH,2
 INT 21H
POP CX
POP DX
POP AX
ENDM

GETWEEK MACRO CHAR   ;显示星期
 PUSH AX
 PUSH DX
 PUSH SI
 PUSH CX
 
 LEA SI,D_TAB

 MOV AL,CHAR
 XOR AH,AH
 MOV CX,AX
 LOOP1:INC SI
    INC SI
  LOOP LOOP1
 
 MOV DX,[SI]  
 MOV AH,9
 INT 21H
 
 POP CX
 POP SI
 POP DX
 POP AX
ENDM

GETMONTH MACRO CHAR   ;显示月份
 PUSH AX
 PUSH DX
 PUSH SI
 PUSH CX
 
 LEA SI,M_TAB

 MOV AL,CHAR
 DEC AL
 XOR AH,AH
 MOV CX,AX
 
 LOOP2:INC SI
    INC SI
  LOOP LOOP2
 
 MOV DX,[SI]  
 MOV AH,9
 INT 21H
 
 POP CX
 POP SI
 POP DX
 POP AX
ENDM

DATAS SEGMENT
 divisors        DW 10000, 1000, 100, 10, 1
 results          DB 0,0,0,0,0,"$"        ;存放五位数ASCII码
 BUF DB 'A$'
 BUF1 DB 'YUE$'
 
 D_TAB DW SUN,MON,TUE,WED,THU,FRI,SAT
 M_TAB DW JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DCE,TIM
 
 SUN DB 'Sunday$'
 MON DB 'Monday$'
 TUE DB 'Tuesday$'
 WED DB 'Wednesday$'
 THU DB 'Thursday$'
 FRI DB 'Friday$'
 SAT DB 'Saturday$'

 JAN DB 'January$'
 FEB DB 'February$'
 MAR DB 'March$'
 APR DB 'April$'
 MAY DB 'May$'
 JUN DB 'June$'
 JUL DB 'July$'
 AUG DB 'August$'
 SEP DB 'September$'
 OCT DB 'October$'
 NOV DB 'November$'
 DCE DB 'December$'
 TIM DB '.M. $'

DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
 
LLL:
mov ah,2
mov bh,0
mov dh,0
mov dl,0
int 10h


 MOV AH,2CH
 INT 21H
 GETNUM CH
 DISP 3AH
 GETNUM CL
 DISP 3AH
 GETNUM DH
 DISP 00H
 CMP CH,12
 JA P
 DISP 41H
 JMP A
P:  DISP 50H
A:  MOV DX,M_TAB+24
 MOV AH,9
 INT 21H
 
 MOV AH,2AH
 INT 21H

 GETWEEK AL 
 DISP 2CH  
 GETMONTH DH
 DISP 00H
 GETNUM DL 

 DISP 2CH 
 showyear CX 
 

 MOV AH,06H
 MOV DL,0FFH
 INT 21H
 JE LLL
  
    MOV AH,4CH
    INT 21H
CODES ENDS

    END START