访问CMOS RAM

来源:互联网 发布:c语言流程图例子 编辑:程序博客网 时间:2024/05/17 04:22

 

在看书过程中遇到一个问题:

以“年//日 时::秒”的格式,显示当前的日期、时间。

我们知道 CMOS RAM 中存放着当前的时间:年,月,日,时,分,秒。这6个信息的长度都为1个字节,存放单元为:          秒:0   分:2     时 :4   日:7   月:8   年:9 这些数据以BCD码的方式存放。当我们从CMOS RAM的8号单元中读出一个字节后,进行如下处理:

        mov ah,al          ;al中为从CMOS RAM的8号单元读出的数据
        mov cl,4
        shr ah,cl                 ;ah中为数据的十位数码值
        and al,00001111b    ;al中为数据的个位数码值
这样再进行(ah)+30h和(al)+30h的操作便得到十进制数对应的ASCII码。
以下代码为动态显示当前的日期、时间:

assume   cs:code  
  data   segment  
    db   9,8,7,4,2,0  
    db   '/','/',0,':',':',0  
  data   ends  
  code   segment  


    start:     mov   ax,data  
                mov   ds,ax  
                mov   ax,0b800h  
                mov   es,ax  
                mov   si,0  
                mov   di,160*12+30*2  


                mov   cx,6  
            s:mov   al,[si]  
                out   70h,al  
                in   al,71h  
                call   c  


                mov   es:[di],ah      ;ah中为数据的十位数码值
                mov   es:[di+2],al   ;al中为数据的个位数码值
                mov   bl,[si+6]        ;特殊字符
                mov   es:[di+4],bl  
                inc   si  
                add   di,6  
                loop   s  
   
                in   al,60h  
                cmp   al,10h  
                je   quit  
                jmp   start  
               
      quit:mov   ax,4c00h  
                int   21h  
   
            c:push   cx  
                mov   ah,al  
                mov   cl,4  
                shr   ah,cl  
                and   al,00001111b  
                add   ah,30h  
                add   al,30h  
                pop   cx  
                ret  
  code   ends  
  end   start 

更加结构化的算法,贴上网上的一篇算法:
完整程序如下[此程序运行后按‘Q’键即可正常退出]:

assume cs:code

code segment

start:

        mov bx,0b800h

        mov es,bx

        mov di,
160*12+2*30        ;初始化显存的偏移地址,

        push di                      ;此处为第12行第30列。

        mov al,
10      ;为了有规律可循,初始al的值为10(十进制)

 

rdate:  ;读取日期

        dec al                        

        cmp al,
7

        jb rtime        ;当读完‘日’后,就跳至标号rtime处

        call show

        add di,
6

        jmp 
short rdate

 

rtime:  ;读取时间

        sub al,
2                

        cmp al,0feh        ;为无符号数相减

        je sign            ;当读完‘秒’后,就跳至标号sign处

        call show

        add di,
6

        jmp 
short rtime

 

sign:   ;显示相关符号

        pop di

        add di,
4                  ;定位第一个'/'符号在显存的偏移地址

        mov 
byte ptr es:[di],'/'

        add di,
6

        mov 
byte ptr es:[di],'/'

        add di,
12                  ;跳过日期与时间之间的空格

        mov 
byte ptr es:[di],':'

        add di,
6

        mov 
byte ptr es:[di],':'



        
in al,60h

        cmp al,10h ;Q键的扫描码

        je quit

        jmp start

      ;以上4句为动态获取系统时间的关键

quit:   mov ax,4c00h

        
int 21h

 

show:   push ax

        push cx

 

        
out 70h,al

        
in al,71h

 

        mov ah,al

        mov cl,
4

        shr ah,cl

        and al,00001111b

 

        add ah,30h

        add al,30h

 

        mov 
byte ptr es:[di],ah

        mov 
byte ptr es:[di+2],al

        pop cx

        pop ax

        ret

 

code ends

end start
原创粉丝点击