Assembly x86视频模式清晰屏幕

Assembly x86视频模式清晰屏幕,assembly,x86,nasm,dos,bios,Assembly,X86,Nasm,Dos,Bios,你好,我正试图用这段代码在DOS视频模式下清除屏幕 但当我运行它时,圆点仍然存在 org 100h mov ah, 0 ; set display mode function. mov al, 13h ; mode 13h = 640x480 pixels, 256 colors. int 10h ; set it! mov cx, 10 ; column mov

你好,我正试图用这段代码在DOS视频模式下清除屏幕

但当我运行它时,圆点仍然存在

    org 100h

    mov     ah, 0       ; set display mode function.
    mov     al, 13h     ; mode 13h = 640x480 pixels, 256 colors.
    int     10h         ; set it!

    mov     cx, 10      ; column
    mov     dx, 10      ; row
    mov     al, 15      ; white
    mov     ah, 0ch     ; put pixel
    int     10h         ; draw pixel

    ; -------  clear the screen ----------     
    ; -------  doesn't work! dot is still there

    mov ax,0B800h
    mov es,ax
    xor di,di
    xor ax,ax
    mov cx,2000d
    cld
    rep stosw

    ; -------------------------------------

    ;wait for keypress
    mov ah,00
    int 16h

    mov ax, 4c00h ; exit to operating system.
    int 21h

    ;======================================================

我尝试用INT 10重置视频模式,但这会使我闪烁,这在我的循环中是不需要的

您的代码有一些问题

首先,BIOS模式13h不是8位/像素的640x480,而是8位/像素的320x200

B800h是BIOS文本模式的地址。BIOS图形模式使用A000h

因此,它应该是:

mov ax,0A000h
mov es,ax
mov cx,32000d
cld
rep stosw
8位320x200占用320*200=64000字节的视频内存。因此,
cx
的值不正确。应该是:

mov ax,0A000h
mov es,ax
mov cx,32000d
cld
rep stosw

对于文本模式,您可以使用这个简单的过程

clrscr proc
    mov ax,0003h
    int 10h 
    ret
endp
然后在你的程序中调用它

call clrscr

下一个代码适用于MSDOS5.0。它在vga模式下工作(640x480像素,16色调色板)

我希望这能有所帮助

请原谅我可能犯的错误

该代码已重新编辑,包括迈克尔·佩奇的更正。谢谢你,迈克尔

如果您需要阅读一些文档,可以在此处阅读:


模式13h是320x200而不是640x480,缓冲区位于段0xa000而不是0xb800,缓冲区大小是32000个字而不是2000.s/16000/32000/否则+1@user786653固定的。我在想,在32位DOS代码中,我会执行xor eax,eax;mov-ecx,16000d;rep stosd然后让我感到困惑…这解释了很多,现在它是如此的平滑:D非常感谢:)注意,您可以做一些类似于
mov cx,320*200/2
的事情,使它更容易阅读(更容易看到“幻数”来自何处)并且更不容易出错。汇编器将为您计算常数。问题是他没有使用文本模式,这会将视频模式更改为文本模式。他还尝试将视频模式重置为他实际使用的模式,但这会导致不必要的闪烁。你应该解释一下这段代码,因为它可能对一些人来说没有帮助,无法理解为什么会这样。不过,这段代码中有一个bug。您的代码假设4位平面当前已启用,情况可能是这样,也可能不是这样。您确实应该确保它们都已启用
MOV-DX,3C4H
MOV-AX,0F02H
OUT-DX,AX
以及您执行了一项不寻常的设置CX的操作。将AX中的值乘以40。如果您知道屏幕大小为640*480,则清除屏幕所需的字数将为640*(480/8)/2。您可以用
MOV-CX,640*(480/8)/2
替换它,而不是使用
MOV-BX,40
MUL-BX
MOV-CX,AX
。您的方法恰好将需要清除的屏幕内存地址数量增加了一倍。