5

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

40h
44h
46h

此处找到的文档提到端口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

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

4

1 回答 1

5

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

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

于 2021-08-25T09:01:10.467 回答