在 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 STOSW 。 CX 将被设置为 (320*200)/2 而不是 (320*200)/4。 16 位处理器不允许 32 位操作数,因此不支持 STOSD.
您可以轻松地将此代码转换为汇编语言函数。
所以目前我正在将屏幕缓冲区 (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 STOSW 。 CX 将被设置为 (320*200)/2 而不是 (320*200)/4。 16 位处理器不允许 32 位操作数,因此不支持 STOSD.
您可以轻松地将此代码转换为汇编语言函数。