Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
1
emu8086

Пользовательский обработчик прерывания мыши

20.05.2020, 12:02. Показов 2098. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
прив! написал программу пользовательского обработчика прерывания мыши для emu8086..
но никакой символ не выводится после нажатия левой кнопки мыши в указанную область..
в чем здесь дело? как исправить?

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
.model tiny
.code
org 100h
start:  
    jmp load
 
vector label dword
old_off33 dw ?
old_seg33 dw ?
 
mousehnd proc       
    ;вызвать функцию из стандарного обработчика мыши 
    mov ah,3    ;получить позицию мыши и статус кнопок
    pushf
    call cs:vector
    
    ;проверить нажатие левой кнопки мыши
    test bx,1
    jz fin
    
    ;горизонтальная позиция курсора мыши
    cmp cx,100
    jg fin
    
    ;вертикальная позиция курсора мыши
    cmp dx,100
    jg fin
    
    ;если попадание, то вывод символа на дисплей
    push 0B800h
    pop es
    mov di,0
    mov es:[di],1144h
        
    fin:
    iret
mousehnd endp
 
    load:
    ;установить текстовый режим
    mov ah,0
    mov al,3
    int 10h
    
    ;инициализация мыши
    mov ax,0
    int 33h
    
    ;показать курсор мыши
    mov ax,1
    int 33h
    
    ;получить вектор стандартного обработчика мыши
    mov ah,35h
    mov al,33h
    int 21h
    
    ;сохранить вектор стандартного обработчика мыши
    mov old_seg33,es
    mov old_off33,bx
    
    ;установить пользовательский обработчик мыши
    mov ah,25h
    mov al,33h
    mov dx,offset mousehnd
    int 21h
    
    ;заглушка
    jmp $
    
    ret
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2020, 12:02
Ответы с готовыми решениями:

Обработчик прерывания(звук)
Здравствуйте,у меня такое задание: разработать обработчик прерывания который при нажатии некоторой...

Обработчик прерывания клавиатуры
По идее обработчик отлавливает нажатие на клавишу SHIFT и устанавливает соответствующий бит в слове...

Обработчик прерывания таймера
На языке ассемблер написать резидентную программу, которая бы обрабатывала прерывание по времени...

Собственный обработчик прерывания
Изменить код так, чтобы по нажатию клавиши esc программа закрывалась Data segment time dw...

3
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.05.2020, 20:00 2
Задача именно перехватить сервисное прерывание int 33h или на период выполнения своей программы внедрить обработчик событий (перемещение, нажатие/отпускание кнопок)?

Целесообразно последнее, но ход мыслей преподавателей извилист...

По пользовательскому прерыванию есть в FAQ
https://www.cyberforum.ru/post10032856.html
и всякие однообразные примеры, у которых меняется лишь обработчик
- в текстовом режиме
Удаление элементов по нажатию левой клавиши мыши
При нажатии на правую кнопку мышки, содержимое чётных и нечётных столбцов экрана обменять местами.
Вывод текстового файла на экран. Цветовая "подсветка" символов. Изменение цвета фона мышью.
Переключение видеостраниц при нажатии левой кнопки мыши
Переключение видеостраниц при нажатии левой кнопки мыши
Обменять верхнюю и нижнюю части экрана по нажатию левой кнопки мыши
Нажатием левой кнопки мыши выбирать и запоминать цвет, при нажатии правой кнопки мыши - устанавливать выбранный цвет
Выводить координаты мышки по срабатыванию любой кнопки мышки каждый раз разными цветами

Вывод координат мыши на экран - Mikl___ хорошо прокомментировал, хороший вывод на экран
Вывод координат мыши в левом верхнем углу экрана - Charles Kludge предложил первый вывод координат без начального вызова обработчика из драйвера
Вывод на экран консоли номера строки и столбца, соответствующие положению курсора мыши непосредственно перед выводом - shilovec5377 для вывода координат в текстовом режиме замедлил курсор

- в графическом режиме
Управление манипулятором мышь - изменение формы курсора в зависимости от координат.
Манипулятор "мышь" - изменение формы курсора в зависимости от координат
Выбор типа курсора мыши по нажатию на клавиши
Нарисовать прямоугольник заданного размера, положение на экране определяется нажатием кнопки мыши
Рисование линии при помощи мыши
0
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
21.05.2020, 17:40  [ТС] 3
ФедосеевПавел, ссылки, конечно, совсем не плохо..
но хотелось бы перестать быть впечатлительным, а реально смотреть на вещи..
что конкретно не так в моем прикрепленном коде обработчика прерывания мыши, даже не смотря на эмулятор emu8086 ??


ФедосеевПавел,
p.s. тему не нужно было переименовывать..
пжл, верните прежнее название, где уклон сделан именно на перехват и обработку..

чтобы в самом пользовательском обработчике можно было вызывать какие-то функции стандартного обработчика,
а какие-то прокидывать мимо цели.. а вывод символа там будет или что-то другое значения никакого не имеет..
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
21.05.2020, 21:47 4
Прерывание int 33h - это сервисное прерывание, вроде int 16h - которое, как бы клавиатурное.
Т.е. они вызываются исключительно программно, а не аппаратно.

Если вы хотите сделать резидента, который у другой программы будет забирать управление мышью, то перехват int 33h - то, что нужно.

Но если вы хотите запустить программу, в которой события мыши будут в фоне обрабатываться пользовательским прерыванием, то нужно не int 33h перехватывать, а через int 33h указать адрес такого обработчика.
Тогда основная программа будет такой (копирую из FAQ)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
;основная программа
main            proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;попытка инициализации мыши
        mov     ax,     0000h
        int     33h
        cmp     ax,     MouseInitOk
        je      @@MouseInitOk
        ;если инициализация не удалась - вывести сообщение
        ;и завершить программу
        mov     ah,     09h
        lea     dx,     msgMouseFault
        int     21h
        jmp     @@Exit
 
@@MouseInitOk:
        ;установить графический режим
        mov     ah,     00h
        mov     al,     13h
        int     10h
 
        ;установить курсор
        call    MouseCursorCross
        mov     MouseCurrentCursor,     0001h
        ;показать курсор
        mov     ax,     0001h
        int     33h
        ;установить пользовательский обработчик событий "мыши"
        push    es
        mov     ax,     seg MyMouseHandler
        mov     es,     ax
        mov     dx,     offset  MyMouseHandler
        mov     cx,     MouseEvent_Move
        mov     ax,     000Ch
        int     33h
        pop     es
 
        ;цикл ожидания нажатия кнопки ESC
        ;в цикле проверяется работа обработчика мыши
@@WaitEscapePressed:
        call    ReadKey
        cmp     al,     KeyCode_Esc
        jne     @@WaitEscapePressed
 
        ;завершение работы с "мышью"
        ;спрятать курсор
        mov     ax,     0002h
        int     33h
        ;удалить пользовательский обработчик прерывания
        mov     cx,     MouseEvent_None
        mov     ax,     000Ch
        int     33h
 
        ;установить текстовый режим
        mov     ah,     00h
        mov     al,     03h
        int     10h
 
@@Exit:
        mov     ax,     4C00h
        int     21h
main            endp
В этом фрагменте проверяется наличие мыши, инциализируется графический режим, назначается графический курсор мыши, показывается курсор, назначается пользовательское прерывание по событиям мыши, ожидается нажатие ESC, завершается работа с мышью и выход из программы.
А вот все действия по событиям мыши выполняются в процедуре пользовательского обработчика.
Вот именно там и прописываются действия по нажатию кнопок, перемещению.
У всех примеров, которые я привёл - основная программа абсолютно одинаковая. Менялся лишь обработчик.
1
21.05.2020, 21:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2020, 21:47
Помогаю со студенческими работами здесь

Обработчик прерывания звуковой карты
здр. имеются процедуры перехвата и восстановления обработчика прерывания звуковой карты Sound...

Свой обработчик прерывания клавиатуры
Помогите пожалуйста написать свой обработчик клавиатурного прерывания: меня в частности интересует,...

Обработчик прерывания int 21h (по книге Калашникова)
Доброе время суток, я чтиаю книгу Калашникова-Ассемблер и уже втрой день не могу понять почему...

Резидентный обработчик прерывания 21h (по книге Калашникова)
Всем добрый день. Изучаю ассемблер по книге Калашникова . Программа перехватывает 21-ое...

Резидентный обработчик 21h прерывания (из 10-й главы Калашникова)
Имеется вот такой код резидентного обработчика прерываний, написанный предположительно на MASM...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru