Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2013, 21:37   #1
Vi[RUS]
Новичок
Джуниор
 
Регистрация: 20.11.2010
Сообщений: 2
По умолчанию Завершение резидентной программы по нажатию клавиши

Имеется резидентная программа, которая после запуска периодически выводит некоторое сообщение на экран и должна завершаться по нажатию на клавишу "Esc".
Имеется код:
Код:
code segment
assume cs:code , ds:code
    org 100h
start:
    jmp load
    old_timer dd 0
    old_2f dd 0
    msg_time db 'Set Time$'
    msg  db 'CANCEL - ESC$'
    msg_del db 'Deleted$'
msg_already db 'Already in memory!$'
 
    Sec db 91           ; задержка = 91 тик
    st_sec db 91            ;
 
timer_proc proc
    pushf           ;сохранение флагов в стеке
    call cs:old_timer   ;вызов старого обработчика
    push ax         ;сохранение используемых регистров
    push bx
    push dx
    push es
    push di
    push si
    push ds
    push cs
    pop ds
 
    dec sec             ; минус тик
    jnz exit                ; если не прошло время - на выход
    mov al, st_sec      ; восстановим задержку
    mov sec, al
 
    sti
    cld
 
    mov ax,0B800h            ; настроимся на видеобуфер
    mov es,ax
    xor di,di
    xor bx,bx
    mov ah,0Eh
 
c1:                         ; выводим сообщение
    mov al,msg[bx]
    stosw
    inc bx
    cmp msg[bx],'$'
    jne c1
 
 
    in al, 60h                  ; ожидаем нажатие
    cmp al, 01h             ; клавиши esc
    jne exit
    
    xor di,di                   ; если дождались - продолжаем
    xor bx,bx
    mov ah,0Eh
 
; выводим сообщение об удалении резидента из памяти
c3:
    mov al,msg_del[bx]
    stosw
    inc bx
    cmp msg_del[bx],'$'
    jne c3
 
    lds dx, cs:old_timer        ;восстановим вектор 08h из ячейки
    mov ax, 251ch           ;где он был сохранен при
    int 21h 
 
    lds dx, cs:old_2f
    mov ax, 252fh
    int 21h             ;инициализации
 
    mov es, cs:[2Ch]        ; сегомент окружения
    mov ah, 49h         ; освобождение блока памяти
    int 21h
 
push cs
pop es
 
mov ah, 49h             ; освобождение памяти
int 21h
 
 
 
exit:
    pop ds
    pop si
    pop di
    pop es
    pop dx
    pop bx
    pop ax
    iret
timer_proc endp
 
 
; мультиплексорное прерывние для исключения повторной установки
new_2f proc
    cmp ax, 0CE00h
    jne exit2f
    mov al, 0FFh
    iret
exit2f:
    jmp cs:old_2f
new_2F endp
 
kon:
;инициализация
load:
 
mov ax, 0CE00h
int 2fh
cmp al, 0FFh
jne Cont
 
mov ah, 09h
lea dx, msg_already
int 21h
 
mov ax, 4c00h
int 21h
 
Cont:
    mov ah,09h
    lea dx,msg_time
    int 21h
 
;получение вектора прерываний таймера
    mov ax,351ch
    int 21h
    mov word ptr old_timer,bx
    mov word ptr old_timer+2,es
;установка нового вектора прерываний систменого таймера
    mov ax,251ch
    mov dx,offset timer_proc
    int 21h
 
mov ax,352fh
int 21h
mov word ptr old_2f,bx
mov word ptr old_2f+2,es
 
mov ax, 252fh
mov dx,offset new_2f
int 21h
 
 
;резидентное завершение программы
    mov ah,31h
    mov dx,(kon - start+10Fh)/16
    int 21h
code ends
end start
Однако по нажатию esc программа не выгружается, выгрузится только если удерживать esc некоторое время. Помогите исправить данную ошибку.
Vi[RUS] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие по нажатию клавиши Gamst Общие вопросы Delphi 6 07.02.2012 17:52
Выгрузка резидентной программы по нажатию клавиш triest Паскаль, Turbo Pascal, PascalABC.NET 0 12.06.2011 22:39
Выгрузка резидентной программы по нажатию клавиш triest Помощь студентам 4 11.06.2011 16:22
завершение цикла при нажатии клавиши LLIyPI/IK Общие вопросы C/C++ 8 12.02.2010 13:29
Движения по нажатию клавиши ТРОЯН=) Помощь студентам 5 10.03.2009 21:11