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

Posted

技术标签:

【中文标题】ASM:端口 3c8h 和 3c9h 有啥作用?【英文标题】:ASM: What does port 3c8h & 3c9h do?ASM:端口 3c8h 和 3c9h 有什么作用? 【发布时间】:2017-03-15 15:55:13 【问题描述】:

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

【问题讨论】:

他们控制视频硬件上的 DAC。 @MichaelPetch 谢谢! 更多信息:http://www.osdever.net/FreeVGA/vga/vga.htm。特别是here 和here。 输出到0x03c9会自动前进,所以你不需要在每一个之前输出颜色索引到0x03c8。不幸的是,您永远不知道当前状态是什么,这就是为什么它至少从输出0 索引开始。 (“不幸的是”,如果您正在为 DOS 编写 256B 介绍,保存索引的一个 out 会很有帮助,但它只会在某些 PC+DOS 组合上从 0 颜色开始)。 【参考方案1】:

我记得使用这些端口来设置 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

【讨论】:

以上是关于ASM:端口 3c8h 和 3c9h 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

asm.js 和 WebAssembly 有啥区别?

计算机各个端口有啥作用?

CRS和ASM有啥关系

TCP/IP通信建立的过程怎样,端口有啥作用?

AngularJS于前端开发有啥作用?对比其它框架有何优点?

localhost:8080是啥,有啥作用?