【发布时间】:2018-03-29 15:11:44
【问题描述】:
如何在长模式下使用 AT&T 程序集绘制像素? 我已经在实模式状态下开启了VGA模式。
【问题讨论】:
-
不知道您使用的是哪种 VGA 模式,我假设您知道视频内存的基地址。不确定是通过 VESA 还是其他方式(使用 VESA 兼容模式,您可以查询线性帧缓冲区 LFB 地址)。但是您只需将一个值移动到您想要的像素的内存地址。如果像素的地址在 RDI 中,那么您可以使用
mov %al,(%rdi)之类的内容对其进行更新(使用任何大小的寄存器作为包含您想要的数据的源。 -
@MichaelPetch 我正在使用模式 0x13
-
所以模式 0x13 非常简单。 320x200,您可以通过 0xa0000 的低内存地址访问它。模式 0x13 的每个内存位置(字节)代表一个像素并包含 256 位颜色。如果你想把蓝色放在左上角像素你可以做
movb $0x20,0xa0000。如果您实际上处于 64 位长模式 - 我假设在该示例中您的身份映射低内存低于 1MB。如果您已将视频内存放置在虚拟地址空间的其他位置,则将 0xA0000 替换为适当的内存地址。 -
@MichaelPetch 谢谢,它工作得很好。您是否知道如何获得更大的分辨率以及更好的透明色彩系统?
-
如果你使用VBE你可以获得更高的分辨率,OSDEV Wiki上有教程你可以看看:wiki.osdev.org/User:Omarrx024/VESA_Tutorial。如果您无法通过 VBE 获得所需的分辨率,那么您将不得不编写特定的设备驱动程序代码来访问您拥有的特殊图形硬件(这是一项不平凡的任务)
标签: assembly operating-system att vga