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

Cod*_*dor 5 x86 assembly dos ioports x86-16

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

40h
44h
46h
Run Code Online (Sandbox Code Playgroud)

此处找到的文档提到端口40h-47h属于“可编程间隔计时器”,但详细信息仅在端口上详细说明40h-43h

从反汇编的上下文中,我猜想输入然后用作伪随机数。

我还发现这个参考(德语)没有提到其他 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
Run Code Online (Sandbox Code Playgroud)

应用就是这种微小的效果;读取值用于将 VGA 调色板 RGB 值设置为最好的颜色,最坏的情况下有趣。

Mic*_*her 5

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

要了解的不仅仅是这种有根据的猜测,您需要联系该代码的作者。考虑到 AH 被破坏的 bug,似乎代码是在一个演示派对上在时间压力下创建的,并没有太多的“设计”进入其中。这似乎更像是“它运作良好”。