2017-02-12 78 views
4

this website中,我發現CMOS RAM中的年份僅存儲在一個字節中。CMOS RAM如何在一個字節中存儲年份

enter image description here

據瞭解,一個字節只能容納0到255,所以我寫這篇文章的代碼得到什麼09H店:

assume cs:code,ss:stack 

stack segment 
    db 64 dup (0) 
stack ends 

code segment 
    start: 
    mov ax,stack 
    mov ss,ax 
    mov sp,64 

    mov al,09H 
    out 70H,al 
    in al,71H 

    mov ah,4CH 
    int 21H 
code ends 

end start 

我從端口71H返回值17H,所以這是否意味着CMOS RAM存儲年份由1994 + offset value

如果是這樣,那麼1994年的數字是什麼意思?未來,CMOS RAM如何存儲2249年以上(1994 + 255)?

+0

數據以BCD編碼,而不是二進制。 32年前(幾乎)沒有意義的東西。高半字節包含第一個十進制數字,低半字節包含第二個數字。範圍是[0..99]。是的,我們確實在2017年生活,所以你得到的是正確的。 –

回答

4

CMOS的寄存器09h存儲當前年份當前世紀
其取值範圍從0到99

----------R09-------------------------------- 
CMOS 09h - RTC - YEAR 
Desc: (BCD 00-99, Hex 00-63) 
Notes: BCD/Hex selection depends on Bit 2 of register B (0Bh) 

它被編碼或者作爲BCD(值0x00至0x99)或純二進制(值0x00至0x63)。
編碼由寄存器的位2 0XB

----------R0B-------------------------------- 
CMOS 0Bh - RTC - STATUS REGISTER B (read/write) 

Bitfields for Real-Time Clock status register B: 
Bit(s) Description  (Table C002) 
7  enable cycle update 
6  enable periodic interrupt 
5  enable alarm interrupt 
4  enable update-ended interrupt 
3  enable square wave output 
2  Data Mode - 0: BCD, 1: Binary 
1  24/12 hour selection - 1 enables 24 hour mode 
0  Daylight Savings Enable - 1 enables 

確定在我的系統寄存器0XB具有值0X2(24-H使能,BCD日期)。
2017年的寄存器0x9讀取0x17,在我的參考框架中,對於我的時間表而言,這是正確的。

+0

從以前的答案,我有另一個問題。爲什麼不同的操作系統(或不同的編程語言)具有完全不同的歷元和範圍? – Kon

+1

@Kon因爲它們是由不同的人設計的。回到80年代,節省了一個字節是值得的。後來我們確認了這個錯誤並使用了一個int(大多數體系結構都是4字節)。後來,這又變成了問題,我們在現代圖書館中增加了一倍。 –

+0

我的意思是日期已經準確存儲在CMOS中,操作系統(包括BIOS)從CMOS RAM讀取當前日期。所以他們的時代和範圍應該與CMOS RAM相同。但事實是,每個人都有自己的時代和範圍。 – Kon

0

年份榨取取決於您的操作系統和Epoch參考日期!

檢查也:System time

例子: DOS(微軟)具有範圍從1980年1月1日至2099年12月31日

年值比2099更大的不支持!

+0

確實。你的意思是存儲在CMOS中的日期只是**數據**。如何理解它取決於操作系統? – Kon