Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Сохранить и загрузить видео буфер


Автор: champion 15.5.2008, 20:49
Код

save:
        mov     ah,3Ch         
        xor     cx,cx           
        mov     dx, fil         
        int     21h

        mov     ax,3d02h  
        mov     dx, fil        
        int     21h


        mov bx, ax
        push bx
        mov     ah,40h     
        mov     cx,0FA00h
        xor edx, edx
        mov     dx, 0A000h

        int     21h

        mov     ah,3Eh     
        pop bx
        int 21h      
int 20h
fil    db      'graph.bas',0   
handle dw 0    

С помощью кода выше сохраняю содержимое видео буфера в graph.bas, код ниже - программа восстанавливающая буфер, но в ней ошибка  ничего не выводит. В вчем проблема?
Код

Load: 
open: 
        mov ax,3d00h                                    
        mov dx, fil
        int 21h
read:
        mov bx, ax
        mov ah,40h
        mov cx,0FA00h              
        mov dx, 0A00h
        int 21h
close:
        mov ah,3eh
        int 21h
delay:
       mov ax, 0800h
       int 21h
int 20h
fil db 'graph.bas',0


Автор: anwe 15.5.2008, 21:30
А сам файл создается? Я не знаю что за ассемблер, может какой fasm и в нем все работает, но для tasm'а надо указывать адрес строки с именем файла:
Код

mov     dx, offset fil 
Но главное не это. Главное, что при восстановлении опять используется функция 40h - запись в файл - вместо 3Fh - чтение из файла.

Автор: dumb 16.5.2008, 02:57
вызов функции 3d после 3c не нужен(я, кстати, про это уже говорил smile).
сохраняешь в файл ты не видео-буфер, а неизвестно что:
Цитата(champion @  15.5.2008,  21:49 Найти цитируемый пост)
        mov     dx, 0A000h

да и загружаешь(как уже отметил anwe - используя неверную функцию) из файла тоже неизвестно куда, возможно портя при этом память своего приложения:
Цитата(champion @  15.5.2008,  21:49 Найти цитируемый пост)
        mov dx, 0A00h


адрес видео-буфера - A000:0000(=A0000).
Код

        mov     ah,3Ch         
        xor     cx,cx           
        mov     dx, offset fil
        int     21h
        mov bx, ax
        mov     ah,40h     
        mov     cx,0FA00h
push ds
mov dx,0a000h
mov ds,dx
xor dx,dx
        int     21h
pop ds
        mov     ah,3Eh     
        int 21h 

Автор: champion 16.5.2008, 21:13
Объясните пожалуйста, для чего мы используем ds? насколько понимаю, это data segment, почему нужно использовать именно этот регистр?
Правильно ли я понял, что ds используется для указания того, что, куда и откуда писать?

Добавлено через 2 минуты и 27 секунд
переписал код сохранения и загрузки, теперь выглядят так:
Код

save:
        mov     ah,3Ch          ; create file
        xor     cx,cx           ; sets the file attribute
        mov     dx, fil         ; gets the file name
        int     21h

        mov     ax,3d02h        ; open file read/write
        mov     dx, fil         ; gets the file name
        int     21h


        mov bx, ax
        push bx
        mov     ah,40h          ; write to file
        mov     cx,0FA00h               ; text len
        xor edx, edx
        mov     dx, 0A000h
        push ds
        mov ds, dx
        xor dx , dx
        int     21h
        pop ds
        mov     ah,3Eh          ; close file
        pop bx
        int 21h 

И загрузка:
Код


org 100h
mov ax, 013h
int 10h


open: 
        mov ah,3Ch
        xor cx, cx
        mov dx, fil
        int 21h
read:
        mov bx, ax
        mov ah,40h
        mov cx,0FA00h              
        push ds
        mov dx, 0A000h
        mov ds, dx
        xor dx, dx
        int 21h
        pop ds
        mov ah, 3Eh
            int 21h
close:
        mov ah,3eh
        int 21h
 delay:
mov ax, 0800h
int 21h

int 20h
fil db 'graph.bas',0


Но не работает..

Автор: anwe 17.5.2008, 00:50
Цитата(champion @  16.5.2008,  20:13 Найти цитируемый пост)
Правильно ли я понял, что ds используется для указания того, что, куда и откуда писать?
Он указывает на сегмент видеопамяти.

Цитата(champion @  16.5.2008,  20:13 Найти цитируемый пост)
почему нужно использовать именно этот регистр?
Да можешь и другой сегментный, возьми es, к примеру.

Цитата(champion @  16.5.2008,  20:13 Найти цитируемый пост)
Но не работает.. 

1)
Цитата(dumb @  16.5.2008,  01:57 Найти цитируемый пост)
вызов функции 3d после 3c не нужен

champion, не обижайся, но читать умеешь?  smile А умеешь читать внимательно? smileЕсли по внимательности, то просто видно, что 3D у тебя идет после 3C при загрузке в файл, в первом куске кода. Значит эти строки лишние:
Код

        mov     ax,3d02h        ; open file read/write
        mov     dx, fil         ; gets the file name
        int     21h

А вот во втором куске кода первоначально у тебя использовалась лишь 3D функция. А если она не следует после 3C, значит здесь ее убирать не надо!
Если же по логике, то что можно считывать со вновь созданного файла, который не открыт 3D функцией, а заново создан функцией 3C?! smile Опять, менять не надо было!

2) Уже я писал, может
Цитата(anwe @  15.5.2008,  20:30 Найти цитируемый пост)
надо указывать адрес строки с именем файла
то есть использовать offset

3) Уже же было:
Цитата(anwe @  15.5.2008,  20:30 Найти цитируемый пост)
при восстановлении опять используется функция 40h - запись в файл - вместо 3Fh - чтение из файла.


Автор: champion 17.5.2008, 12:00
Anwe, благодарю за терпение! Вопрос решен!
Dumb, благодарю за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)