汇编语言 访问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(低位)。行得通,但是当我把“年”输出做好了之后,发现,还有五个要做,这样下去程序会非常长,所以必须要用循环。可是以当时的设计,做循环是不可能的,每个两位数中间都有'\'或者':'等字符。然后去瞄了一眼答案,瞬间恍然大悟。。世上那么多条路可以选,我偏偏选了最难走的那一条:(