汇编语言 实验14 访问CMOS RAM

汇编语言 访问CMOS RAM


CMOS RAM

是什么?

存放计算机开机必备的一些数据的硬件,由BIOS(Basic input/output system)调用其数据。

怎么用?

首先要理解端口的概念,在计算机中,与CPU可以访问的数据的位置可以有一下三种:存储器、寄存器、端口。而端口的另一端是芯片,即CPU通过端口与其他芯片相连。在这些芯片中,都有一组可供CPU读写的寄存器。站在CPU的角度,CPU对这些寄存器统一编址。
那么怎么进行访问呢?首先要明白,CPU对于端口寄存器只有两种操作类型:in(从端口读取数据)、out(向端口输出数据)。
例如: in al,71h(从71h端口读取数据,放到寄存器al中)
      out 70h,al(将寄存器al中的数据传送到70h端口中)
      注:对端口的操作只能用al或者ax寄存器。 

输出时间程序

时间在CMOS RAM中的表示形式:

秒:在0号单元
分:2
时:4
日:7
月:8
年:9

思路:

这里可以用实验13(3)的思路,将用到的数据放在code块中,并通过offset进行访问,简单粗暴

源程序:

assume cs:code

code segment
index: db 9,8,7,4,2,0
string: db 'yy/mm/dd hh:mm:ss'

start:  mov ax,code
    mov ds,ax
    mov si,offset index
    mov bx,offset string
    mov cx,6
s:  push cx
    mov al,ds:[si]
    out 70h,al
    in al,71h
    mov ah,al
    mov cl,4
    shr ah,cl
    and al,00001111b
    add al,30h
    add ah,30h
    mov [bx],ah
    mov [bx+1],al
    inc si;最后一次循环后,指向string
    add bx,3
    pop cx
    loop s
    ;显示字符串
    mov ax,0b800h
    mov es,ax
    mov di,160*12+40*4
    mov cx,17
s0: mov al,ds:[si]
    mov es:[di],al
    add di,2
    inc si
    loop s0

ok: mov ax,4c00h
    int 21h

code ends
end start

自我总结

一开始的思路是,定义data段,将单元号放进去,然后再把‘\’和‘:’放进去(好蠢。。),然后在把从CMOS RAM中取出的al通过一个函数,直接变成:ah(高位)al(低位)。行得通,但是当我把“年”输出做好了之后,发现,还有五个要做,这样下去程序会非常长,所以必须要用循环。可是以当时的设计,做循环是不可能的,每个两位数中间都有'\'或者':'等字符。然后去瞄了一眼答案,瞬间恍然大悟。。世上那么多条路可以选,我偏偏选了最难走的那一条:( 
posted @ 2017-06-16 21:38  ka1n4t  阅读(659)  评论(0编辑  收藏  举报