Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись содержимого видеобуфера в файл, Резидентная программа 
:(
    Опции темы
sharq
Дата 17.12.2005, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: нет
Всего: 28



Пишу резидентную программу, которая при нажатие на Ctrl записывала бы содержимое видеобуфера в файл.
Вот мой код:
Код

resident segment 'code'
    assume CS: resident, DS: resident
    org 100h
my proc far
    jmp init    ; not if jump on section init
    
    old_28 dd 0 ; for store system of 28 int, cause 09 isn't reENTERable
    old_09 dd 0 ; for store system of 09 int
    
    flag   db 0 ; flag 1-write to file
    handle dw 0 ; file handle
    symbol db 0 ; symbol
    file   db 'video.txt', 0 ; file
    
    ; new obrabotchik 09
    new_09 proc
        push AX
        
        in  AL, 60h 
        cmp AL, 29 ; ctrl down
        je PROCESS
        jmp STOP
        
        PROCESS:
            mov CS:flag, 1
            jmp STOP
        
        STOP:
            pop AX
            jmp CS:old_09
        
    new_09 endp
    
    ; new obrabotchik 28
    new_28 proc
        cmp CS:flag, 1
        je WRITE
        jmp CS:old_28
        
        WRITE:
            push AX
            push BX
            
            ; create file
            push CS
            pop  DS
            ; mov AX, seg CS:file
            ; mov DS, AX
            mov DX, offset CS:file
            mov AH, 3ch
            mov CX, 0
            int 21h
            
            jmp writebuffer
            
            RETURN:
                mov CS:flag, 0
                
                pop BX
                pop AX
                
                jmp CS:old_28
    new_28 endp
    
    ; write content videobuffer to file
    writebuffer proc
        push AX
        push ES
        push DS
        push BX
        
        ; open file for write
        push CS
        pop  DS
        
        mov DX, offset CS:file
        mov AH, 3dh
        mov CX, 1
        int 21h
        mov CS:handle, AX
        
        ;start of videobuffer
        mov AX, 0b800h
        mov ES, AX
        
        mov BX, 0
        mov CX, 25
        LOOPROW:
            push CX
            
            mov CX, 160
            MYLOOP:
                push CX
                
                mov AL, ES:[BX]
                mov CS:symbol, AL
                inc BX
                
                push BX
                
                push CS
                pop DS
                mov DX, offset CS:symbol
                mov AH, 40h
                mov BX, CS:handle
                mov CX, 1
                int 21h
                
                pop BX
                
                pop CX
            loop MYLOOP
            
            pop CX
        loop LOOPROW
        
        pop BX
        pop DS
        pop ES
        pop AX
        
        ;iret
        jmp RETURN
    writebuffer endp
    
    res_size = $ - my
    
    ; section init
    init proc
        
        ; save system 09
        mov AX, 3509h
        int 21h
        mov word ptr old_09, BX
        mov word ptr old_09 + 2, ES
        
        ; save system 28
        mov AX, 3528h
        int 21h
        mov word ptr old_28, BX
        mov word ptr old_28 + 2, ES
        
        ; replace
        mov AX, 2509h
        mov DX, offset new_09
        int 21h
        mov AX, 2528h
        mov DX, offset new_28
        int 21h
        
        ; load
        mov DX, (res_size + 10Fh)/16
        mov AX, 3100h
        int 21h
    init endp
    
resident ends
    end my


Компилирую под tasm'ом, запускаю из-под nc.
При нажатие на ctrl и при выходе из nc - создается файл, размером 4000 б - вроде все правильно, но содержимое не синего окошка nc, а командной строки, причем кажlая буква отделена от другой символом bel. И все записывается в строчку.
Код

A<bel>s<bel>s<bel>e<bel>m<bel>b<bel>l<bel>i<bel>n<bel>g<bel><bel> f<bel>i<bel>l<bel>e<bel>:   


Как записать правильно содержимое видеобуфера, без символов bel и как есть (т.е. не в строчку)?
Наверно, я записываю не тот лист видеобуфера.

И еще: почему файл создается только при выходе из nc?

smile

Это сообщение отредактировал(а) sharq - 17.12.2005, 01:38


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
sharq
Дата 19.12.2005, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: нет
Всего: 28



Проблема решилась. Просто надо писать 2 байта, а не один. smile

Код

                mov SI, 0
                mov CX, 2
                LOOPSYMBOL:
                    mov AL, ES:[BX]
                    mov CS:symbol[SI], AL
                    inc BX
                    inc SI
                loop LOOPSYMBOL


Для того, чтобы все писать не в строчку, а как есть, нужно ставить 13 символ.

smile

Это сообщение отредактировал(а) sharq - 19.12.2005, 11:44


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.0418 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.