Assembly 在长模式下使用VGA绘制像素

Assembly 在长模式下使用VGA绘制像素,assembly,operating-system,att,vga,Assembly,Operating System,Att,Vga,如何在长模式下使用AT&T组件绘制像素? 我已经在实模式状态下启用了VGA模式。我的代表只有1岁,因此我无法发表评论,但如果您接受这一部分答案,您应该调查位平面。模式13很容易实现,因为它在0xA000(64000字节)下适合小于64k的内存,但当图形模式需要大于64k的内存时,VGA适配器采用了过于复杂的位平面解决方案 位平面是存储在VGA控制器内部存储器上的64k内存块,其中至少包含4个“存储组”。您需要使用相关端口的in和out指令与VGA控制器进行对话,以便告诉VGA适配器您希望映射到0

如何在长模式下使用AT&T组件绘制像素?
我已经在实模式状态下启用了VGA模式。

我的代表只有1岁,因此我无法发表评论,但如果您接受这一部分答案,您应该调查位平面。模式13很容易实现,因为它在0xA000(64000字节)下适合小于64k的内存,但当图形模式需要大于64k的内存时,VGA适配器采用了过于复杂的位平面解决方案

位平面是存储在VGA控制器内部存储器上的64k内存块,其中至少包含4个“存储组”。您需要使用相关端口的in和out指令与VGA控制器进行对话,以便告诉VGA适配器您希望映射到0xA000段的银行,然后通过mov、xor和等处理0xA000,就像您在模式13中所做的那样。。。。但是这就是问题变得复杂的地方

对于所有模式,这些银行不只是作为连续块出现。在16位和24位颜色模式下,一个组中的单个字节只能表示其中一个RGB组件,最终输出实际上是所有位平面相互重叠的组合,就像投影仪屏幕上的三张幻灯片一样,但您一次只能操作一张幻灯片,必须通过输入和输出指令与VGA控制器对话,告诉它您想要哪个组使用

如果内存没有问题的话,VGA控制器是一个16位总线,需要一次与一个字节通信,这使得它更加烦人。我不确定这些端口,但你可以在任何列表中找到它们


抱歉,这不是一个完整的答案,而是一个需要调查的途径。“VGA位平面”。

不知道您使用的是什么VGA模式,我假设您知道视频ram的基址。不确定是通过VESA还是其他方式(使用符合VESA的模式,您可以查询线性帧缓冲区LFB地址)。但您只需将一个值移动到所需像素的内存地址。如果像素的地址在RDI中,则可以使用类似于
mov%al、(%RDI)
(使用任意大小的寄存器作为包含所需数据的源。@MichaelPetch我使用的是模式0x13,因此模式0x13非常简单。320x200,您可以通过0xa0000的低内存地址访问它。每个内存位置(字节)of模式0x13表示单个像素,包含256位颜色。如果要在左上角像素中添加蓝色,可以执行
movb$0x20,0xa0000
。但是,如果您实际上处于64位长模式-我假设在该示例中,您的标识映射低内存低于1MB。如果您在虚拟内存中的其他位置放置了视频内存地址空间然后用适当的内存地址替换0xA0000。@MichaelPetch谢谢,它工作得很好。你可能知道如何获得更高的分辨率,或者更好的透明度颜色系统吗?如果你使用VBE,你可以获得更高的分辨率,并且在OSDEV Wiki上有教程,你可以浏览:。如果你无法获得分辨率,请访问如果希望通过VBE实现解析,则必须编写特定的设备驱动程序代码才能访问您拥有的特殊图形硬件(这是一项非常重要的任务)