分辨率高于640x480的x86 asm图形设置?

时间:2009-09-10 14:50:39

标签: assembly graphics x86 bios

我刚刚开始使用汇编语言(感觉就像学习新东西一样),并且遇到了一些问题(到目前为止),我一直在寻找的所有教程都没有回答,或者说太旧了知道。

1)我尝试了一些搜索(也许我只是不知道正确的关键字),但我找不到更新屏幕分辨率等图形模式的更新列表。我找到的最好的是:Assembler Tutorial,我几乎不认为640x480是最好的分辨率汇编语言可以使用。 有谁知道我可以使用更新的教程?

编辑:中断10h已过时,并且支持不超过640x480

2)是否可以将值从变量“移动”到另一个变量而不先将其移动到寄存器?例如:

jmp start
  n1     dw 0
  n2     dw 0
  res    dw 0
start:
  mov n1,5
  mov n2,6
  mov res,n1
  add res,n2
...etc...

编辑:这是不可能的。如果不使用寄存器,就无法从内存转到内存。

3)问题1,是否有办法检测用户当前使用的图形模式,以便我可以更改它,然后将其更改回来? (我假设有,但我不知道该怎么做。)

编辑:需要查询操作系统的图形设置。

4 个答案:

答案 0 :(得分:4)

对于问题#1和#3,请查看VESA BIOS Extensions。这是处理90年代流行的“超级VGA”模式的标准。

至于#2,一般答案是否定的,你不能将MOV内存存储到内存中。但事实并非如此:有MOVS(移动字符串),它将字节,字或双字从DS:SI移动到ES:DI。通常,此指令与REP前缀一起使用以移动内存块。此外,假设您已经设置了堆栈,您可以通过推送和弹出来移动内存到内存而不会破坏寄存器:

PUSH [mem1]
POP  [mem2]

答案 1 :(得分:2)

关于你的第一个问题,中断10很老,可能不会超出640x480的分辨率。现在使用软件堆栈的不同部分;即,你必须询问Windows以获得当前的屏幕分辨率。

答案 2 :(得分:2)

This rather verbose post包含有关如何使用汇编程序在Windows中驱动DirectX的大量详细信息。 DirectX是目前图形处理的关键API系列,你不会使用DOS时代的中断并直接编程VGA帧缓冲区。

答案 3 :(得分:1)

中断10h基本上是一个操作系统函数调用(实际上它运行BIOS代码)。在内部,它读/写视频内存以及显卡上的各种寄存器。要了解在“内部”中断10h内发生什么类型的事情,请检查this输出。

在Windows下运行DOS程序时,它在虚拟DOS机器上运行。 Windows实际上并没有让它触摸显卡,而是让它与虚拟显卡一起玩。通常这只延伸到VGA屏幕模式(有时只有文本模式),即你拥有的是虚拟VGA卡(不是现代显卡)。因此,在Windows下的16位汇编语言中,您无法使用现代图形卡的全部功能。

是的,当然,汇编语言可以让你做任何图形卡可以做的事情。但只有在以下情况之一:

  • 您的程序可以不受限制地访问图形硬件(例如,您正在编写Windows或Linux设备驱动程序,或者是在纯DOS或您自己的内核中执行),或者
  • 您的程序通过适当的操作系统界面。

如果您仍然对汇编语言感兴趣,我建议您尝试编写一个玩具内核。这样做,你将学到很多东西。

如果您想了解更多信息,请发表评论。