x86汇编程序在VirtualBox(XGA Graphics-VBE)下运行不佳

x86汇编程序在VirtualBox(XGA Graphics-VBE)下运行不佳,graphics,assembly,x86,virtualization,Graphics,Assembly,X86,Virtualization,我试图了解虚拟化是如何影响我的x86汇编程序的 通常情况下,我会启动一台老式的奔腾III,然后用USB键启动DOS。相反,我尝试设置虚拟盒,并以这种方式工作我的程序似乎运行正常,但颜色似乎都出错了。 这是一个在NASM下组装的相当简单的程序,它将视频模式切换到XGA 4105h,并以不同的颜色绘制一些简单的形状 是否可以安全地假设问题源于我的机器的实际视频模式不是真正在XGA模式下运行,因此颜色的位的解释不同?(请原谅我在解释中的无知,因为我对虚拟化如何在ISA级别工作知之甚少) 我该如何回避这

我试图了解虚拟化是如何影响我的x86汇编程序的

通常情况下,我会启动一台老式的奔腾III,然后用USB键启动DOS。相反,我尝试设置虚拟盒,并以这种方式工作我的程序似乎运行正常,但颜色似乎都出错了。

这是一个在NASM下组装的相当简单的程序,它将视频模式切换到XGA 4105h,并以不同的颜色绘制一些简单的形状

是否可以安全地假设问题源于我的机器的实际视频模式不是真正在XGA模式下运行,因此颜色的位的解释不同?(请原谅我在解释中的无知,因为我对虚拟化如何在ISA级别工作知之甚少)

我该如何回避这个问题?我想继续做x86图形编程,但我喜欢能够在移动设备上工作

编辑:我看到,至少在windows下,当尝试执行16位代码时,windows运行在一个虚拟化环境中,该环境不允许程序直接访问视频卡,而是允许访问通常不超过VGA的“虚拟卡”


但是,因为我已经在一个虚拟环境中,这又是如何发挥作用的呢?我完全被束缚住了吗?

4105h是VBE 1 bios和DOSBOX的标准化VBE模式编号。但从VBE2开始,模式编号不再标准化。对于VBE 2或VBE 3 bios,如果不使用DOSBOX,则必须从卡bios获取模式号

为了从VBE 2或VBE 3 bios中获取这些模式编号,我们必须使用VBE函数4F00获取512字节缓冲区中的VBE SVGA信息。在这个缓冲区+0Eh中,我们可以找到modelist的地址(偏移量、段),通过这个地址我们可以得到modenumber。模型师以0FFFF这个词结尾

此外,如果我们使用DOSBOX,对于每个模式编号,我们可以在另一个256字节的缓冲区中使用VBE函数4F01h获得特定于模式的信息。现在我们可以检查模式属性、分辨率、每像素字节数、每扫描线字节数、胶片位置、红色、绿色和蓝色的遮罩大小以及其他标准,如果它们符合我们正在寻找的要求


Dirk

是的-我在DosBoxHave中收到了类似的结果,您尝试了更现代的真实PC。4105h(模式编号?)相当大,我认为只有少数较低的数字是标准化的。在一台非常新的联想笔记本电脑上尝试了此解决方案,结果类似。发布了再现问题的最小代码。