所以目前我正在将一个屏幕缓冲区(screenbuffer db 64000 DUP(0))复制到视频内存(从0a0000h开始)以清除屏幕。但我想知道再次设置视频模式是否更好:
mov ax, 13h
int 10h
似乎也清除了屏幕。
或者是否有更好的方法来清除屏幕?
答案 0 :(得分:4)
有清除屏幕的INT 10H功能:AH=06h, AL=00h
您可以在BH
中设置颜色。
这是INT 10H 向上滚动窗口功能,如果AL = 0则清除屏幕
该功能适用于在其他寄存器中设置的矩形区域,例如DH =下行号,DL =右列号。
清除屏幕的标准方法是将CX设置为0000H,DL设置为0040:[004a] -1(通常为79),DH至0040:[0084](通常为24),BH至07H(白色开启)黑色视频属性),AL到00H(清除整个屏幕)。
答案 1 :(得分:4)
您可以使用带有STOSD前缀的REP来清除video mode 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
此代码假设您使用的是32位处理器,但并不假设您在unreal mode中运行。
如果您使用的是16位处理器(8086/80186/80286),则必须使用16位寄存器,并使用 REP STOSW 。 CX 将设置为(320 * 200)/ 2而不是(320 * 200)/ 4。 16位处理器不允许使用32位操作数,因此不支持 STOSD 。
您可以轻松地将此代码转换为汇编语言函数。