访问CMOS RAM 【 以"年/月/日 时:分:秒" 的格式,显示当前的日期、时间】

;访问CMOS RAM
;
;编程:
;  以"年/月/日 时:分:秒" 的格式,显示当前的日期、时间
;

  1 assume cs:code

  2 

  3 data segment

  4  db '9/8/7 4:2:0', '$'

  5 data ends

  6 

  7 code segment

  8 start:

  9  

 10    mov ax, data

 11    mov ds, ax

 12    mov bx, 0

 13    mov di, 0 ;初始化参数

 14  

 15  s:  

 16    mov al, [bx] ;al 传递的参数 注意此时al存放的是9的ASCII码

 17    cmp al, '$'

 18    je quit 

 19    call date

 20    inc bx

 21    jmp short s

 22    

 23  ;注意:在s 与 jmp short s  之间不能修改di的值  

 24 

 25 

 26  ;--------------------------------

 27  ;显示时间的子程序

 28  ;参数:

 29  ; 1、al  在COMS RAM中存放时间的地址

 30  ; 2、di  显示的偏移地址 初始位置

 31  ;

 32  ;--------------------------------

 33  date:

 34     push ax

 35     push bx

 36     push cx

 37     push es

 38     

 39     mov bx, 0b800h

 40     mov es, bx

 41     mov bl, 0ah

 42     

 43     ;==================

 44     ;判断模块

 45     ;==================

 46     ;9/8/7 4:2:0    

 47     

 48     ;不是0~9的ASCII码

 49     cmp al, 30h  

 50     jb showfen   

 51     cmp al, 39h

 52     ja showfen   

 53     

 54     ;是0~9的ASCII码

 55     sub al, 30h

 56 

 57     cmp al, 9

 58     je showdate

 59     cmp al, 8

 60     je showdate

 61     cmp al,7

 62     je showdate

 63     cmp al, 4

 64     je showdate

 65     cmp al, 2

 66     je showdate

 67     cmp al, 0

 68     je showdate

 69     

 70     ;都不是则直接显示

 71     add al, 30h

 72     jne showfen

 73   

 74     ;==================

 75     ;显示时间模块

 76     ;==================

 77  showdate: 

 78     ;mov al, 9   al作为参数传递进来

 79     out 70h, al

 80     in al, 71h

 81     mov ah, al

 82     mov cl, 4

 83     shr ah, cl

 84     and al, 00001111b

 85     

 86     ;ASCII才能显示  所有要转换成ASCII

 87     add ah, 30h

 88     add al, 30h

 89     

 90     mov byte ptr es:[160*12+40*2+di], ah  ;显示十位

 91     mov byte ptr es:[160*12+40*2+di+1], bl

 92     mov byte ptr es:[160*12+40*2+di+2], al  ;显示个位

 93     mov byte ptr es:[160*12+40*2+di+3], bl

 94     add di, 4

 95     jmp short dateend

 96     

 97    ;==================

 98    ;显示分割符模块

 99    ;==================

100  showfen:  

101    mov byte ptr es:[160*12+40*2+di], al  ;显示分隔符

102    mov byte ptr es:[160*12+40*2+di+1], bl

103    add di, 2

104    

105  dateend:

106    pop es

107    pop cx

108    pop bx

109    pop ax

110   

111    ret

112    

113  quit:  

114   mov ax, 4c00h

115   int 21h

116   

117 code ends

118 end start

 

你可能感兴趣的:(OS)