Поиск:

Ответ в темуСоздание новой темы Создание опроса
> клавиатура в дос 
V
    Опции темы
xach
  Дата 21.12.2007, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня есть резидентная прога которая вешает свой обработчик на 9h - прерывание (от клавы то бишь) как мне перехватывать нажатия клавиш не поганя информацию для всех последующих обработчиков?
Код

in al,60h
;...
jmp far dword [addr]

этот вариант не катит (экспериментально убедился =) )

addr - адрес дефольтного обработчика...
если делать всё самому то бишь сбрасывать флаг прерывания:
Код

mov al,20h
out 20h,al

и не вызывать дефольтный обработчик, а ставить
Код

iret

тогда всё прекрасно работает...вотъ...
 smile 
З.Ы. всё под чистым досом!!!
З.З.Ы. возможно любое решение. не обязательно с прерыванием, можно и с какой-либо функций дос...лишь бы работало...

заранее мерси!
PM MAIL   Вверх
xach
  Дата 21.12.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот начирикал!
прога в резиденте на escape выводит нолик в левой верхней части экрана. загвоздка в том, что в вин98 отлично пашет (реально клава свободна для ввода команд и т.д.), а под чистым досом подвешивает всё!

написана на фасме.

Код

org 100h

start:
    mov ax,3509h
    int 21h
    mov [addr],bx
    mov [addr+2],es
    mov dx,int9
    mov ah,25h
    int 21h

    mov dx,0ffh
    int 27h

int9:
    pusha
    pushf
    push es

    in al,60h
    dec al
    jnz .nocall
    push 0b800h
    pop es
    mov di,80*2
    mov [es:di],word 0b30h
.nocall:

    pop es
    popf
    popa
    jmp far dword [cs:addr]

addr:    dw 0


есть идеи?
PM MAIL   Вверх
ksili
Дата 21.12.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Дык она точно резидентно загружается? по-моему нет. поэтому в винде она просто висит в памяти как один из процессов. А в ДОСе многозадачности нет, вот она одна и выполняется

Добавлено через 2 минуты и 36 секунд
Если приведённый код и есть вся программа, то в ней нету корректного завершения программы. Правда я на фасме не писал


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
xach
Дата 21.12.2007, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не-не-не!..она возвращает управление volcov commander-у а потом уже виснет...а в винде всё тоже верно, ибо окно-то консольное однозадачное!..хоть и эмуляция.

она и не должна завершаться...загрузочная часть заканчивается int 27h и dos оставляет прогу в резиденте, то бишь просто не даёт никому записаться по этому адресу. а всю работу делает обработчик прерывания...вотъ...

Это сообщение отредактировал(а) xach - 21.12.2007, 09:48
PM MAIL   Вверх
ksili
Дата 21.12.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Как она может виснуть, если она уже вернула управление в DOS? Или систему вешает сам установленный обработчик при первом нажатии клавиши?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
xach
Дата 21.12.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



да, как только жмёшь на клавишу - виснет...даже не выводит символ...а в консоли винды всё ок...
PM MAIL   Вверх
ksili
Дата 21.12.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Цитата(xach @  21.12.2007,  13:33 Найти цитируемый пост)
jmp far dword [cs:addr]

а это что такое? Разве так надо возвращаться из обработчика прерывания?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
dumb
Дата 21.12.2007, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 2
Всего: 158



Цитата(xach @  21.12.2007,  09:33 Найти цитируемый пост)
    mov dx,0ffh
    int 27h

у тебя только PSP занимает 100h + твой код. навскидку - сделай mov dx,200h.

а вообще, обычно делают так:
Код

org 100h
start: jmp init
; код обработчиков
init:
...
  mov dx, offset init
  int 27h

PM MAIL   Вверх
ksili
Дата 21.12.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Вот здесь
Цитата(xach @  21.12.2007,  13:33 Найти цитируемый пост)
jmp far dword [cs:addr]

во время выполнения программы [cs:addr]конечно указывает на обработчик, но ведь потом же программа выгружается и cs может измениться. По-моему, адрес перехода в стандартный обработчик надо указывать по-другому


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
xach
Дата 21.12.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ksilidumb, спасибо всё заработало. я и вправду забыл про 100h начального смещения...пишешь его всё время, а потом уже и забываешь что это значит...

 smile 

[eof]
PM MAIL   Вверх
dumb
Дата 21.12.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 2
Всего: 158



Цитата(ksili @  21.12.2007,  10:08 Найти цитируемый пост)
По-моему, адрес перехода в стандартный обработчик надо указывать по-другому 
нет, там все нормально: при установке обработчика в таблицу векторов прерываний записывается указатель на наш обработчик в форме seg:ofs, где seg = cs, т.е. при вызове обработчика cs устанавливается как нужно.
PM MAIL   Вверх
drwatson
Дата 27.4.2009, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.3.2006

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



у меня похожая задача: надо по нажатию ctrl+alt+p сделать так чтобы дос перестал реагировать на клаву и начал заново реагировать при повторном нажатие ctrl+alt+p. Само сабой программа резидентная. Вот только не пойму почему постоянно вылетает из доса с ошибкой:
 user posted image
Мой код:
Код

code    segment
        assume  cs:code,ds:code
        org     100h
start:  jmp     load
    old    dd  0
    status    db  1 ;0-off 1-on

key_h    proc
    pushf
    push ax
    push es
    push ds

    push    cs
    pop    ds

    in al,60h
    cmp al,25 ;p
    jne old_h
    xor ax,ax
    mov es,ax
    mov ah,es:[417h]
    test ah,4   ;ctrl
    jz old_h
    test ah,8   ;alt
    jz old_h

    inc status
    jmp exit

old_h:    test status,1
    jz exit
      pop ds
      pop es
      pop ax
      call      cs:old
      iret
exit:
    in    al,61h
    mov    ah,al
    or    al,80h
    out    61h,al
    xchg    ah,al
    out    61h,al

    mov    al,20h
    out    20h,al

    pop    ds
    pop    es
    pop    ax
    iret

key_h    endp
end_key_h:

load:    mov    ax,  3509h
    int     21h
    mov     word ptr old,  bx
    mov     word ptr old + 2,  es
    mov    ax,  2509h
    mov    dx,  offset key_h
    int    21h
    mov    ax,3100h
    mov    dx, (end_key_h-start + 10Fh) / 16
    int    21h
code    ends
        end     start

PM MAIL   Вверх
airyashov
Дата 28.4.2009, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 1
Всего: 6



Цитата(drwatson @ 27.4.2009,  23:50)

Код

key_h    proc
    pushf
    push ax
    push es
    push ds

  ....
exit:
    in    al,61h
    mov    ah,al
    or    al,80h
    out    61h,al
    xchg    ah,al
    out    61h,al

    mov    al,20h
    out    20h,al

    pop    ds
    pop    es
    pop    ax
    iret


одна из ошибок которую вижу
это флаги из стека убрать при выходе по метке exit

Это сообщение отредактировал(а) airyashov - 28.4.2009, 08:04


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
drwatson
Дата 30.4.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.3.2006

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



Цитата(airyashov @  28.4.2009,  08:03 Найти цитируемый пост)
одна из ошибок которую вижу
это флаги из стека убрать при выходе по метке exit


вроде помогло, спасибо. только я не понял почему флаги из стека надо убирать когда я сам завершаю прерывание и не надо когда я выполняю стандартный обработчик
PM MAIL   Вверх
drwatson
Дата 1.5.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.3.2006

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



Ну раз тут так хорошо помогают, позволю себе задать еще один вопрос. А как теперь эту резидентную программу корректно выгрузить? И еще желательно освободить память. А то я просто восстанавливаю вектор девятого прерывания, но программа работает не стабильно.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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