代码之家  ›  专栏  ›  技术社区  ›  Sivvy

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

  •  3
  • Sivvy  · 技术社区  · 15 年前

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

    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 回复  |  直到 6 年前
        1
  •  4
  •   I. J. Kennedy ShankarSangoli    13 年前

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

    至于2,一般来说答案是否定的,你不能将内存移动到内存中。但这并不是严格正确的:有movs(move string),它将字节、单词或双字从ds:si移动到es:di。通常,该指令与rep前缀结合使用,以移动内存块。另外,假设您设置了一个堆栈,您可以通过按下和弹出将内存移动到内存,而不必删除寄存器:

    PUSH [mem1]
    POP  [mem2]
    
        2
  •  2
  •   Robert Harvey    15 年前

    关于您的第一个问题,中断10是非常老的,可能不会使用超过640x480的分辨率。现在使用的是软件栈的另一部分;即,您必须询问Windows才能获得当前的屏幕分辨率。

        3
  •  2
  •   unwind    15 年前

    This rather verbose post 包含了许多关于如何使用汇编程序在Windows中驱动DirectX的详细信息。DirectX是目前图形的关键API系列,使用DOS时代的中断和直接对VGA帧缓冲区进行编程不会有太大进展。

        4
  •  1
  •   Artelius    15 年前

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

    在Windows下运行DOS程序时,它在虚拟DOS计算机中运行。Windows实际上不允许它触摸图形卡,而是允许它与虚拟卡一起播放。通常,这只扩展到VGA屏幕模式(有时仅限于文本模式),即您拥有的是虚拟VGA卡(而不是现代图形卡)。因此,在Windows下的16位汇编语言中,您不能使用现代图形卡的全部功能。

    是的,当然,汇编语言可以让您做图形卡可以做的任何事情。但前提是:

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

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

    如果需要进一步的信息,请留言。