BIOS 连续两次从不同的端口读取到同一个寄存器

Jia*_*Cai 2 assembly operating-system bios

我是组装新手。在试图弄清楚 BIOS 做什么时,我使用gdb来跟踪它。然而,我发现了一些对我来说很奇怪的事情。
代码段是这样的:

[f000:d129]    0xfd129: mov    eax,0x8f
[f000:d12f]    0xfd12f: out    0x70,al
[f000:d131]    0xfd131: in     al,0x71
[f000:d133]    0xfd133: in     al,0x92
[f000:d135]    0xfd135: or     al,0x2
[f000:d137]    0xfd137: out    0x92,al
Run Code Online (Sandbox Code Playgroud)

我想知道为什么 BIOS 会连续从端口 0x71 和 0x92 读取。第二条指令会覆盖从端口 0x71 读取的值吗?那么为什么它从端口 0x71 读取呢?

谢谢!

Bre*_*dan 5

IO口0x70为“CMOS/RTC索引寄存器”,IO口0x71为“CMOS/RTC数据寄存器”。要访问 CMOS 中的某些内容,您应该设置索引,然后读取/写入数据寄存器。

对于某些 RTC 芯片,如果您设置索引并且不读取或写入数据寄存器,则芯片处于未定义状态。这意味着如果你想为以后设置一个索引,你必须从数据寄存器中读取以避免现在和以后之间的“未定义状态”。

换句话说; 读取的值不相关 - 读取会导致副作用,而重要的是副作用。