3

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

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

4 回答 4

4

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

至于#2,通常答案是否定的,您不能将内存移动到内存。但这并不完全正确:有 MOVS(移动字符串),它将一个字节、字或双字从 DS:SI 移动到 ES:DI。通常该指令与 REP 前缀结合使用以移动内存块。此外,假设您设置了一个堆栈,您可以将内存移动到内存,而不会通过推送和弹出来破坏寄存器:

PUSH [mem1]
POP  [mem2]
于 2009-09-10T15:39:18.773 回答
2

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

于 2009-09-10T14:56:07.597 回答
2

这篇相当冗长的帖子包含很多关于如何使用汇编程序在 Windows 中驱动 DirectX 的详细信息。DirectX 是当今图形的关键 API 系列,使用 DOS 时代的中断和直接编程 VGA 帧缓冲区不会走得太远。

于 2009-09-10T15:38:45.450 回答
1

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

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

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

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

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

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

于 2009-11-04T07:25:46.463 回答