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)
这似乎也清除了屏幕。
或者有没有更好的方法来清除屏幕?
您可以使用带有REP前缀的STOSD来清除视频模式 13(320x200x256 颜色)的视频内存。REP STOSD将按照ECX中存储的计数重复STOSD。STOSD会将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 STOSW。CX将设置为 (320*200)/2 而不是 (320*200)/4。16 位处理器不允许使用 32 位操作数,因此不支持STOSD。
您可以轻松地将这段代码转换为汇编语言函数。