напишите ассемблерный код, который хранит то, что было написано на экране, очистите экран, а затем восстановите то, что было написано

Мне нужно написать ассемблерный код, который сохраняет то, что было написано на экране (в dosbox) в текстовом режиме, очищает экран, а затем восстанавливает то, что было написано ранее, поэтому я написал этот код, но он не работает правильно. кто-нибудь может указать, почему? буду очень благодарен

P.S. я еще нуб

Вот мой код:

Dataseg segment
    Data_seg dw 2000 dup(?)
Dataseg ends


Codeseg segment

Main PROC  far   

            assume ds:Dataseg,cs:Codeseg,ss:stackseg

        Mov ax,Data_seg
        Mov es,ax
        Mov ax,0b800h
        Mov ds,ax       
        Mov cx,25*80 ;(rows)*cols-default for screen

        Mov di,OFFSET Data_seg
        Mov si,0   
        CLD             ;autoincrement
        Rep movsw


        ;now clearing the screen

        Mov cx,25*80
        Mov ax,0b800h
        Mov es,ax
        Mov ax,0720h
        Mov di,0
        Rep stosw


        ;now restoring the contents of the screen
       Mov ax,Data_seg
       Mov ds,ax
       Mov cx,25*80
       Mov di,0
       Mov si,OFFSET Data_seg
       Rep movsw





     Mov Ah,4ch
     Int 21h


Main endp
Codeseg ends
     end Main

person boomerang    schedule 22.11.2014    source источник
comment
Что вы подразумеваете под работает неправильно?   -  person Jester    schedule 22.11.2014
comment
он отображает что-то странное вроде этого dropbox.com/s/1fiftl548j1vhhs/ извините, мне пока не разрешено публиковать изображения в сообщениях   -  person boomerang    schedule 22.11.2014


Ответы (2)


Вы перепутали "Dataseg" (имя сегмента) и "Data_seg" (имя переменной). Mov ax,Data_seg загружает смещение переменной Data_seg, не сегмент. Есть два варианта загрузки сегмента:

Mov ax, SEG Data_seg    ; Load the segment of variable Data_seg

or

Mov ax, Dataseg         ; Load the segment called "Dataseg" 
person rkhb    schedule 22.11.2014
comment
во-первых, спасибо за помощь .. Я попробовал то, что вы предложили, и эта жуткая вещь больше не появляется, но я никогда не замечаю никаких выходных данных или изменений, происходящих на экране, разве я не должен заметить никаких изменений после запуска exe? - person boomerang; 22.11.2014
comment
Смена старого-нового-старого происходит слишком быстро, поэтому кажется, что ничего не делается. Попробуйте изменить некоторые символы в Data_seg перед восстановлением. - person rkhb; 22.11.2014

Заменять:

Mov ax,Data_seg
Mov es,ax
Mov ax,0b800h
Mov ds,ax
Mov di,OFFSET Data_seg
    Mov si,0

by:

push cs
pop es
mov di, OFFSET Data_seg
Mov ax,0b800h
Mov ds,ax 
xor si, si ;set pointer to the beginning of the screen

Заменять:

   Mov ax,Data_seg
   Mov ds,ax
   Mov cx,25*80
   Mov di,0
   Mov si,OFFSET Data_seg
   Rep movsw

by:

   push cs
   pop ds
   mov ax, 0b800h
   mov es, ax
   Mov cx,25*80
   Mov di, 0
   Mov si,OFFSET Data_seg
   Rep movsw
person Van Uitkon    schedule 23.11.2014