汇编语言 实验14 访问CMOS RAM

来源:互联网 发布:如何判断网络是否连通 编辑:程序博客网 时间:2024/05/21 17:54

汇编语言 访问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:codecode segmentindex: db 9,8,7,4,2,0string: db 'yy/mm/dd hh:mm:ss'start:  mov ax,code    mov ds,ax    mov si,offset index    mov bx,offset string    mov cx,6s:  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,17s0: mov al,ds:[si]    mov es:[di],al    add di,2    inc si    loop s0ok: mov ax,4c00h    int 21hcode endsend start

自我总结

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