如何在 x8086 程序集中同时为多个像素着色?

How do I color multiple pixels at the same time in x8086 assembly?

我在 Windows10 上使用带有 VGA 模式和 8 位固定 RGBA 像素格式的 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 和 Web 的其余部分跳来跳去,试图找到完成 objective 的基本代码,但找不到任何东西。接受的答案 似乎是最接近答案的东西,尽管我不清楚我是否真的需要像额外的段和推送和弹出这样的技术来访问和写入多个像素地址。不仅如此,我试了答案中的代码,汇编程序告诉我BITS是非法指令,mov [es:di],dx中的参数是错误的。

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

重复我在这个话题中的评论之一:

当运行我的汇编代码带有mov [bx], ax绘制像素的指令时,每次要执行该指令时,我的机器都在使用CPU - 已经负担其他任务 - 自行访问和写入屏幕内存(A000H 或 B000H 的 VRAM),这会占用太多时间。 (参见 Refresh Rates, V-Sync Settings and Frame Buffers Explained on YouTube and 'Framebuffer' on Wiki。)

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

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

可能不需要 DMA 来减轻 accessing/writing 操作的 CPU。在 80 年代,还没有带有图形库和 GPU 的图形加速器,它们只是在 90 年代初期才出现,目的是让动画在更高清晰度的世界中更加流畅。 (参见 'DMA' on Wiki。)