访问 PIT (?) IO 端口 44h 和 46h - 这些端口有什么作用?

Access to PIT (?) IO ports 44h and 46h - what do those ports do?

我在反汇编 MS-DOS .com 应用程序时遇到了一些我不理解的端口访问。更准确地说,通过 IN 指令,从以下端口读取值。

40h
44h
46h

找到的文档 here mentions ports 40h-47h belong to the 'Programmable Interval Timer', but the details 仅详细说明端口 40h-43h

根据反汇编的上下文,我猜输入随后被用作伪随机数。

我还发现 this reference(德语),其中没有提到其他 4 个端口。有没有人知道这些端口的确切功能,最好有参考?

编辑:为了提供更多上下文,反汇编的应用程序部分如下所示。

in  al, 46h
mov cl, 03h
div cl
mov bl, ah

in  al, 44h
div cl
mov bh, ah

mov dx, 40h
in  al, dx
div cl

应用程序this效果很小;读取的值用于将 VGA 调色板 RGB 值设置为最好的颜色,最坏的情况下有趣。

你的猜测似乎是正确的。该代码尝试设置随机颜色。由于它是 256 字节介绍的一部分,因此重点主要放在代码大小上,而不是随机数的可移植性或质量上。可能这个可执行文件最初是为 PS/2 或 EISA 系统设计的,定时器 0、3 和 5(第二个芯片的通道 0 和 2)是空闲的 -运行。如果您没有 EISA 系统,混叠通常会再次访问定时器 0、0 和 2。该程序不启用声音,因此定时器 2 会被卡住。此外,代码通过在 1CA 处执行 MUL 指令来破坏由 DIV 指令在 1BE 处生成的 AH,因此不使用从端口 40h 读取的值。

要了解更多有根据的猜测,您需要联系该代码的作者。考虑到 AH 被破坏的错误,代码似乎是在时间压力下在演示派对上创建的,并没有太多的“设计”。看起来更像是“它工作得很好”。