PC上的I/O地址空间是如何安排的?

逆向工程 拆卸 x86 地址 图形
2021-06-23 15:34:30

我正在反汇编 16 位 DOS 可执行文件,并查看以下三个指令:

mov dx,0x3ce
mov ax,0xff08
out dx,ax

我知道它将值写入0xff08I/O port 0x3ce我还知道该端口0x3ce是 IBM EGA 卡上的“图形 1 和 2 地址”寄存器。问题是,根据手册,这个端口应该取一个字节值,而不是一个字。

我猜正在发生的是,这个词0xff08被视为两个不同的字节,其中一个字节在指定的寄存器中结束,另一个字节进入相邻的寄存器。或者可能有问题的字节被丢弃了?无论哪种方式,这都是一种猜测,因为我似乎无法找到有关此特定行为的太多信息。

对于 I/O 地址空间流向哪个方向,或者字的小端存储如何发挥作用,我没有很好的直观感觉。执行此代码段后,哪些端口获得了哪些字节?

1个回答

端口 I/O 的工作方式与内存 I/O 类似,因此低字节 (08) 将写入端口 3CE,而高字节 (0xFF) 将写入端口 3CF。

在模式 12h 中使用位平面的示例

图形控制器(VGA 接口的一部分)的索引端口为 $3CE。数据端口在 (index+1),所以 $3CF。如果我们想将 4 写入索引 2,我们这样做: Port[$3CE]:=2; {索引}端口[$3CF]:=4; { data } 但是有一种方法可以用一个 Port[] 来做到这一点。还有一个 PortW[] 'array',如果被寻址的端口不是 16 位的,它会将低字节发送到地址,将高字节发送到地址+1。正是我们所需要的。示例变为: PortW[$3CE]:=$0402; {低字节索引,高字节数据}