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

What is the best way to clear the screen in 32-bit x86 assembly language (Video mode 13h)

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

mov ax, 13h
int 10h

这似乎也可以清除屏幕。

或者有更好的清屏方法吗?

有INT 10H函数清屏:AH=06h, AL=00h

您可以在BH中设置颜色。

这是 INT 10H 向上滚动 window 功能,如果 AL=0

则清除屏幕

该功能适用​​于设置在其他寄存器中的矩形区域,例如DH = 下行号,DL = 右列号。

标准的清屏方式是设置CX为0000H,DL为0040:[004a]-1(一般为79),DH为0040:[0084](一般为24),BH为07H(白色-on black video 属性),并将 AL 设置为 00H(清除整个屏幕)。

您可以使用 STOSD with a REP prefix to clear video memory for video mode 13(320x200x256 色)。 REP STOSD 将重复 STOSD ECX 中存储的计数。 STOSD 会将 EAX 中的每个 DWORD 写入 ES:[EDI],每次将 EDI 递增 4。

REP: Repeats a string instruction the number of times specified in the count register.

STOSD: stores a doubleword from the EAX register into the destination operand.

示例代码可能类似于:

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

此代码假定您使用的是 32 位处理器,但不假定您在 unreal mode.

中 运行

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

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