用 32 位 x86 汇编语言清除屏幕的最佳方法是什么(视频模式 13h)

T S*_*ake 5 x86 assembly masm real-mode vga

因此,目前我正在将屏幕缓冲区(screenbuffer db 64000 DUP(0))复制到视频内存(从 0a0000h 开始)以清除屏幕。但我想知道像这样再次设置视频模式是否更好:

mov ax, 13h
int 10h
Run Code Online (Sandbox Code Playgroud)

这似乎也清除了屏幕。

或者有没有更好的方法来清除屏幕?

Mic*_*tch 4

您可以使用带有REP前缀的STOSD来清除视频模式 13(320x200x256 颜色)的视频内存。REP STOSD将按照ECX中存储的计数重复STOSDSTOSD会将EAX中的每个 DWORD 写入ES:[EDI],每次将 EDI 递增 4。

REP:按照计数寄存器中指定的次数重复字符串指令。

STOSD:将 EAX 寄存器中的双字存储到目标操作数。

示例代码可能类似于:

cld                    ; Set forward direction for STOSD
mov ax, 0x0013
int 0x10               ; Set video mode 0x13 (320x200x256 colors)

push es                ; Save ES if you want to restore it after
mov ax, 0xa000
mov es, ax             ; Beginning of VGA memory in segment 0xA000
mov eax, 0x76767676    ; Set the color to clear with 0x76 (green?) 0x00=black
xor edi, edi           ; Destination address set to 0
mov ecx, (320*200)/4   ; We are doing 4 bytes at a time so count = (320*200)/4 DWORDS
rep stosd              ; Clear video memory
pop es                 ; Restore ES
Run Code Online (Sandbox Code Playgroud)

此代码假设您使用的是 32 位处理器,但并不假设您正在虚幻模式下运行。

如果您使用 16 位处理器 (8086/80186/80286),则必须使用 16 位寄存器,并使用REP STOSWCX将设置为 (320*200)/2 而不是 (320*200)/4。16 位处理器不允许使用 32 位操作数,因此不支持STOSD

您可以轻松地将这段代码转换为汇编语言函数。