Режим видео x86 Очистить экран

Здравствуйте, я пытаюсь очистить экран в видеорежиме 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, но это дает мне мерцание, которое нежелательно внутри моего цикла.


person Belbesy    schedule 20.12.2012    source источник
comment
Режим 13h — это 320x200, а не 640x480, и буфер расположен в сегменте 0xa000, а не 0xb800, и размер буфера составляет 32000 слов, а не 2000.   -  person user786653    schedule 20.12.2012


Ответы (3)


Есть некоторые проблемы с вашим кодом.

Во-первых, режим BIOS 13h — это не 640x480 при 8 битах на пиксель, а 320x200 при 8 битах на пиксель.

B800h — адрес текстовых режимов BIOS. Графические режимы BIOS используют A000h.

Так должно быть:

mov ax,0A000h
mov es,ax

320x200 при 8 битах потребляет 320*200 = 64 000 байт видеопамяти. Таким образом, значение cx неверно. Так должно быть:

mov cx,32000d
cld
rep stosw
person nrz    schedule 20.12.2012
comment
с/16000/32000/ иначе +1 - person user786653; 20.12.2012
comment
@ user786653 Исправлено. Я думал, что в 32-битном DOS-коде я бы сделал это xor eax,eax; mov ecx,16000d; rep stosd, а потом сам запутался... - person nrz; 20.12.2012
comment
Это многое объясняет, теперь все так гладко :D Большое спасибо :) - person Belbesy; 21.12.2012
comment
Обратите внимание, что вы можете сделать что-то вроде mov cx,320*200/2, чтобы его было легче читать (легче увидеть, откуда берется магическое число) и меньше подвержены ошибкам. Ассемблер рассчитает константу за вас. - person Brendan; 06.01.2019

для текстового режима вы можете использовать эту простую процедуру

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

и вызовите его в своей программе с помощью

call clrscr
person Matúš Košút    schedule 24.03.2015
comment
Проблема в том, что он не использует текстовый режим, а это изменит видеорежим на текстовый. Он также пытался сбросить режим видео на тот, который он на самом деле использует, но это вызвало нежелательные моргания. - person Ross Ridge; 25.03.2015

Следующий код работает на msdos 5.0. Работает в режиме vga (640х480 точек и палитра 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

Я надеюсь, что это может помочь.

Пожалуйста, простите мои возможные ошибки.

Код был отредактирован, чтобы включить исправления Майкла Печа. Спасибо, Майкл.

Если вам нужно прочитать некоторую документацию, ее можно прочитать здесь:

Электронная электронная книга о программировании vga

person José Antonio López Cano    schedule 08.11.2017
comment
Вы должны объяснить этот код, так как он может быть бесполезен для некоторых, чтобы понять, почему это работает. Однако в этом коде есть ошибка. Ваш код предполагает, что 4-битные плоскости в настоящее время включены, что может быть, а может и не быть. Вы действительно должны убедиться, что все они включены с помощью MOV DX, 3C4H MOV AX, 0F02H OUT DX, AX - person Michael Petch; 05.08.2018
comment
Так же вы делаете необычную вещь для набора СХ. Вы умножаете то, что получается в AX, на значение 40. Если вы знаете, что размер экрана составляет 640*480, то количество СЛОВ, необходимых для его очистки, будет 640*(480/8)/2. Вместо того, чтобы делать MOV BX, 40 MUL BX MOV CX, AX, вы можете заменить его на MOV CX, 640*(480/8)/2. Ваш метод почти удваивает количество адресов памяти экрана, которые необходимо очистить. - person Michael Petch; 05.08.2018