assembly x86视频模式清晰屏幕

dzhpxtsq  于 2022-11-30  发布在  其他
关注(0)|答案(3)|浏览(145)

你好,我正试图清除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重新设置视频模式,但这给了我眨眼,这是我循环内不想要的

4urapxun

4urapxun1#

您的程式码有一些问题。
首先,BIOS模式13 h在8位/像素时不是640 x480,而是320 x200。
B800 h是BIOS文本模式的地址。BIOS图形模式使用A000 h。
所以应该是:

mov ax,0A000h
mov es,ax
xor di, di     ; ES:0 is the start of the framebuffer

8位的320 x200占用320*200 = 64 000字节的显存。因此cx的值不正确。它应该是:

mov cx,32000d    ; you can write 320 * 200/2 in your source if you want
cld
xor ax,ax
rep stosw        ; zero 2*CX bytes at ES:DI
5jvtdoz2

5jvtdoz22#

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

clrscr proc
    mov ax,0003h
    int 10h 
    ret
endp

并在程序中调用它

call clrscr
31moq8wy

31moq8wy3#

下一个代码可以在msdos 5.0上运行,它可以在vga模式下运行(640x480像素和16色调色板)。

BORRARPANTALLAVGA:
;Erases the screen in graphic mode
;Input:
;CH: Background color.
    PUSH    AX
    PUSH    CX
    PUSH    DX
    PUSH    DI
    PUSH    ES
    MOV     DX,     3C4H
    MOV     AX,     0F02H
    OUT     DX,     AX
    MOV     DX,     3CEH
    MOV     AH,     CH
    XOR     AL,     AL
    OUT     DX,     AX
    MOV     AX,     0F01H
    OUT     DX,     AX
    MOV     CX,     19200
    XOR     DI,     DI
    MOV     AX,     0A000H
    MOV     ES,     AX
    CLD
    REP     STOSW
    MOV     DX,     3CEH
    MOV     AX,     1
    OUT     DX,     AX
    POP     ES
    POP     DI
    POP     DX
    POP     CX
    POP     AX
    RET

我希望这能有所帮助。
请原谅我可能的错误。
代码已被重新编辑,以包括来自迈克尔佩奇的更正。谢谢迈克尔。
如果您需要阅读一些文档,可以在此处阅读:
Online ebook about vga programming

相关问题