【问题标题】:How CMOS RAM stores year in one byteCMOS RAM 如何将年份存储在一个字节中
【发布时间】:2017-02-12 13:47:49
【问题描述】:

this website中,我发现CMOS RAM中的年份只存储在一个字节中。

已知一个字节只能保存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)的年份?

【问题讨论】:

  • 数据以 BCD 编码,而不是二进制编码。 32 年前(几乎没有)有意义的事情。高半字节包含第一个十进制数字,低半字节包含第二个数字。范围是 [0..99]。是的,我们确实生活在 2017 年,所以你得到的是正确的。

标签: assembly system masm bios


【解决方案1】:

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)。
编码由寄存器0xb的bit2决定

----------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 小时,BCD 日期)。
寄存器 0x​​9 读取 2017 年的 0x17,在我的参考框架中,对于我的时间线,这是正确的。

【讨论】:

  • 从上一个回答来看,我还有一个问题。为什么不同的操作系统(或不同的编程语言)有完全不同的时代和范围?
  • @Kon 因为它们是由不同的人设计的。回到 80 年代,节省一个字节是值得的。后来我们承认了错误并使用了一个 int(在大多数架构上是 4 个字节)。后来这再次成为问题,我们将现代图书馆的规模扩大了一倍。
  • 我的意思是日期已经准确地存储在CMOS中,操作系统(包括BIOS)从CMOS RAM中读取当前日期。所以它们的时代和范围应该与CMOS RAM相同。但事实是每个人都有自己的时代和范围。
  • @Kon,RTC 仅用于在系统断电时跟踪时间。当操作系统启动时,它会将校正因子应用于 RTC 时间并估计时间。通过 NTP 从计时服务器获取更准确的时间。你可以阅读this interesting article about this issue。操作系统总是解释 RTC 时间,旧版本的 MS-DOS 可能会认为我们是在 1917 年,而早期的 Windows 可能会推断出 2017 年,因为程序员对操作系统发布前的几年进行了更正。
【解决方案2】:

年份计算取决于您的操作系统和Epoch 参考日期!

另请查看:System time

示例: DOS (Microsoft) 的范围从 1980 年 1 月 1 日到 2099 年 12 月 31 日。

不支持大于 2099 的年份值!

【讨论】:

  • 确实如此。您的意思是存储在 CMOS 中的日期只是 data。如何理解它取决于操作系统?
猜你喜欢
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 2019-12-20
  • 2018-09-11
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多