0

我在具有 VGA 模式和 8 位固定 RGBA 像素格式的 Windows 10 上使用 emu8086,学习图形和 ASM 的基础知识只是为了好玩。我找到了一种一次绘制一个像素的方法,如下面的代码所示:

org 100h       
mov ax, 13h 
int 10h       
mov ax, 40960
mov ds, ax
mov ax, 2Fh         
mov bx, 0 ; will hold addr of pxl to paint in.   
pntLnClr: 
mov [bx],ax ; paint color in ax into pixel at bx. 
inc bx
cmp bx, 40
JL pntLnClr
mov ah, 0 
int 16h 
ret

我想编写一个 ASM 程序,它可以同时绘制多个像素,而不是从一个像素到另一个像素循环,让它看起来像一条轨迹。我一直在 SO 和网络的其他部分试图找到实现目标的基本代码,但找不到任何东西。这里接受的答案似乎是最接近答案的东西,尽管我不清楚我是否真的需要像额外的段这样的东西以及像推送和弹出这样的技术来访问和写入多个像素地址。不仅如此,我尝试了答案中的代码,汇编器告诉我BITS是一条非法指令,并且里面的参数mov [es:di],dx是错误的。

[编辑:] 这个问题来自于满足创建具有低分辨率的类似 2D 游戏的演示的目标的想法,就像精灵和背景位于同一平面层上的板一样简单。

4

1 回答 1

0

从这个线程迭代我的评论之一:

当使用绘制像素的指令运行我的汇编代码时mov [bx], ax,每次执行该指令时,我的机器都在使用 CPU(已经负担其他任务)来访问和写入屏幕内存(A000H 或 B000H 的 VRAM)所有本身,这占用了太多时间。(请参阅YouTube 上解释的刷新率、垂直同步设置和帧缓冲区以及Wiki 上的“帧缓冲区”。)

[编辑:] 虽然您可以一次访问两个字节/一个字rep stosw,但这仍然不足以在闪存中绘制整个图像屏幕大小。

为了实现创建类似 2D 游戏的演示(具有或不具有滚动功能)的目标,您必须学会捕捉非常大的图像的 320x200 部分。但要做到这一点,您必须学会捕捉至少任何 320x200 的图像。要做到这一点,您必须直接或间接利用硬件将图像存储在其内存中。要执行间接访问硬件之类的操作,您需要编写自己的视频驱动程序。许多人指出,通过在 Assembly 中完成所有这些来重新发明轮子是一种乏味的做法(如此所述)。最好在 C 中完成所有这些工作,除非有特定的专门任务无法在 C 中完成。

可能不需要 DMA 来减轻 CPU 的访问/写入操作。而且在 80 年代,还没有带有图形库和 GPU 的图形加速器,只有在 90 年代初才出现,以使动画在更高清晰度的世界中更加流畅。(参见Wiki 上的“DMA”。)

于 2021-11-25T09:33:46.517 回答