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

时间:2016-12-24 23:07:55

标签: assembly x86 real-mode

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

mov ax, 13h
int 10h

似乎也清除了屏幕。

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

2 个答案:

答案 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

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