ASM:端口 3c8h 和 3c9h 有什么作用?

ASM: What does port 3c8h & 3c9h do?

我正在尝试创建将加载和打印 256 色 BMP 文件的 ASM 代码。
我看到几个代码做这个工作,他们首先加载 0 到端口 3c8h,然后加载调色板到端口 3c9h。
这些端口的负载有什么作用?
另外感谢! :)

我记得使用这些端口设置 VGA 调色板。你在 3c8 上连续输出色号,在 3c9 上连续输出 R、G、B 值,IIRC:

mov al, 1    ; set color index 0's rgb value
mov dx, 3c8h
out dx, al
inc dx       ; now 3c9h
mov al, 11h
out dx, al   ; set R = 11h
mov al, 22h
out dx, al   ; set G = 22h
mov al, 33h
out dx, al   ; set B = 33h

因此,每当 VGA 硬件在视频内存中遇到值“1”时,它就会发出一个 RGB 值为 #112233 的像素。

因为颜色索引寄存器由VGA芯片自动递增,你也可以使用OUTS指令。要根据内存块更改 VGA 卡的整个调色板,您可以简单地执行以下操作:

xor al, al      ; zero al register
mov dx, 3c8h
out dx, al      ; start with color zero
inc dx          ; dx = 3c9h
lds si, palette ; ds:si points to color palette data
mov cx, 300h    ; 3 bytes rgb x 256 colors
rep outsb