Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 21.12.2018
Сообщений: 8
NASM

Изменить чувствительность мыши при нажатии на левую и правую кнопки (пользовательский обработчик)

29.03.2022, 21:24. Показов 1934. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу сделать свой обработчик прерывания мыши. Нужно сделать , чтобы при нажатии левой кнопки мыши чувствительность мыши уменьшалась. При нажатии на правую кнопку мыши - чувствительность увеличивалась. Получилось сделать, чтобы при нажатии на левую кнопку мыши, чувствительность уменьшалась. Не могу сообразить, как сделать ,чтобы на правую увеличивалась. Заранее спасибо.
Код:
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
USE16
ORG 100h
start:
    mov ax,12h  
    int 10h
    mov ax,0    
    int 33h
    mov ax,1    
    int 33h
 
    mov ax,000ch    
    mov cx,0001h
    mov dx, mouse_click
    int 33h
 
    mov ah,0    
    int 16h
    mov ax,000ch    
    mov cx,0000h
    int 33h
    mov ax,3    
    int 10h
    ret
 
mouse_click:
    mov ax,000fh    
    mov cx,500
    mov dx,500
    int 33h
    retf
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.03.2022, 21:24
Ответы с готовыми решениями:

Редактор фигур: при нажатии на правую кнопки мыши меняется и фон, и фигура, а должен только фон
Столкнулся с проблемой, что при нажатии на правую кнопки мыши меняется и фон, и фигура (должен только фон).Как это исправить? Процедура...

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

При нажатии на F1 очистить правую половину экрана, а при нажатии на F2 - левую половину
Здравствуйте)) Помогите мне, пожалуйста, с лабораторной)) Вот задание: Перехват прерываний от клавиатуры и работа с видеопамятью ...

9
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
29.03.2022, 21:56
https://www.cyberforum.ru/post10032856.html

Судя по тексту
Assembler
1
2
3
4
5
6
7
8
9
10
;Обработчик событий "мыши"
;вход
;АХ содержит условие вызова,
;ВХ - состояние кнопок,
;СХ, DX - X- и Y-координаты курсора,
;SI, DI - счетчики последнего перемещения по горизонтали и вертикали
;      (единицы измерения для этих счетчиков - мики, 1/200 дюйма),
;DS - сегмент данных драйвера мыши.
;выход
; - нет
Т.е. нажатие ЛКМ или ПКМ определяется содержимым ax в обработчике. Какие биты проверять - те же, что и в маске при установке пользовательского обработчика.
0
0 / 0 / 0
Регистрация: 21.12.2018
Сообщений: 8
30.03.2022, 12:36  [ТС]
Все равно не совсем разобрался почему не работает. Попробовал так, но не работает.
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
USE16
ORG 100h
start:
    mov ax,12h  
    int 10h
    mov ax,0    
    int 33h
    test ax,ax
    jz exit
    mov ax,1    
    int 33h
 
    mov ax,0ch  
    mov cx,02h
    mov dx,mouse_click
    int 33h
 
    mov ah,0    
    int 16h
    mov ax,14h
    mov cx,0
    int 33h
    
exit:
    mov ah,4ch
    int 21h
 
mouse_click:
    mov ax,03h
    int 33h
    test bx,1
    jz left
    mov ax,0fh ;обработчик прерывания правой кнопки
    mov cx,100
    mov dx,100
    int 33h
    retf    
    
left:
    mov ax,0fh ; левой кнопки
    mov cx,10
    mov dx,10
    int 33h
    retf
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
30.03.2022, 14:50
Мне казалось, что фраза
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
На вход процедуре драйвером передаются в регистрах следующие данные
Code
1
2
3
4
5
6
АХ содержит условие вызова,
ВХ - состояние кнопок,
СХ, DX - X- и Y-координаты курсора,
SI, DI - счетчики последнего перемещения по горизонтали и вертикали
 (единицы измерения для этих счетчиков - мики, 1/200 дюйма),
DS - сегмент данных драйвера мыши.
однозначно воспринимается, как "после перехода на метку mouse_click в регистре ax находится причина вызова пользовательского обработчика, т.е. или нажатие ЛКМ или ПКМ (хотя не исключён вариант не отпускания одной кнопки с нажатием другой - но его пока не будем рассматривать)". Т.е. не понимаю смысла в вызове ax=03h в начале пользовательского прерывания.

Также, я не помню значения функций int 33h и вынужден узнавать по всему тексту узнавать, что же выполняется. Примерно к строке 15 исходника это надоело и остановился. Пишите комментарии или ждите других помощников.
0
0 / 0 / 0
Регистрация: 21.12.2018
Сообщений: 8
30.03.2022, 15:08  [ТС]
Прошу прощения за отсутсвие комментариев. Исправил и добавил комментарии. Цель задачи: вывести курсор в видеорежиме и чтобы при нажатии на левую кнопку мыши чувствительность изменялась(увеличивалась/уменьшалась не важно), а на правую восстанавливалась к исходным значениям (8 по горизонтали и 16 по вертикали). Извините за то, что сильно туплю. Сейчас получается ,что при щелчке на левую кнопку мыши: чувствительность изменяется, а при щелчке на правую не восстанавливается к исходным значениям.
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
USE16
ORG 100h
start:
    mov ax,12h  ;установка видеосервиса 
    int 10h
    mov ax,0    ; проверка драйверов мыши
    int 33h
    test ax,ax ; если драйверов нет, то выходим
    jz exit
    mov ax,1     ; установка курсора
    int 33h
 
    mov ax,0ch   ;установить собственный обработчик прерывания мыши
    mov cx,01h ; маска (при нажатии на левую кнопку мыши)
    mov dx,mouse_click ;дальний указатель на подключаемую подпрограмму пользователя
    int 33h
 
    mov ah,0    ;жду пока не нажмут на клавиатуру
    int 16h
    mov ax,14h 
    mov cx,0 ;удалить обработчик событий мыши
    int 33h
    
exit:
    mov ah,4ch ;выход из программы
    int 21h
 
mouse_click:
    test bx,1 ;если нажали левую кнопку мыши
    jz left
    mov ax,0fh ;обработчик прерывания правой кнопки
    mov cx,8 ; уменьшаем чувствительность мыши до исходных 8(по горизонтали)
    mov dx,16 ; уменьшаем чувствительность мыши до исходных 16( по вертикали)
    int 33h
    retf    
    
left:
    mov ax,0fh ; обработчик прерывания левой кнопки
    mov cx,1 ; изменяем чувствительность мыши(по горизонтали)
    mov dx,1 ; изменяем чувствительность мыши (по вертикали)
    int 33h
    retf
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
30.03.2022, 15:11
И ещё. Для графического режима необходимо установить форму курсора мыши. По ссылке приводится и способ установки и само изображение в виде таблицы данных.

Добавлено через 1 минуту
В строке
Assembler
14
    mov cx,01h ; маска (при нажатии на левую кнопку мыши)
нет упоминания ПКМ
0
0 / 0 / 0
Регистрация: 21.12.2018
Сообщений: 8
30.03.2022, 15:28  [ТС]
Курсор вроде бы есть. Попробовал вот так, тоже не получается. Или что Вы имеете ввиду чтобы упомянуть ПКМ.
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
USE16
ORG 100h
start:
    mov ax,12h  ;установка видеосервиса 
    int 10h
    mov ax,0    ; проверка драйверов мыши
    int 33h
    test ax,ax ; если драйверов нет, то выходим
    jz exit
    mov ax,1     ; установка курсора
    int 33h
    
    mov ax,03h ; получить состояние кнопок мыши
    int 33h
    test bx,1 ; если нажата левая кнопка
    jz left_click
    test bx,2 ; если нажата правая кнопка
    jz right_click
    
    mov ah,0    ;жду пока не нажмут на клавиатуру
    int 16h
    mov ax,14h 
    mov cx,0 ;удалить обработчик событий мыши
    int 33h
    
exit:
    mov ah,4ch ;выход из программы
    int 21h
 
left_click:
    mov ax,0ch   ;установить собственный обработчик прерывания мыши
    mov cx,01h ; маска (при нажатии на левую кнопку мыши)
    mov dx,button_left_click ;дальний указатель на подключаемую подпрограмму пользователя
    int 33h
    retf    
    
right_click:
    mov ax,0ch   ;установить собственный обработчик прерывания мыши
    mov cx,03h ; маска (при нажатии на правую кнопку мыши)
    mov dx,button_right_click ;дальний указатель на подключаемую подпрограмму пользователя
    int 33h
    retf 
 
button_left_click:
    mov ax,0fh ; функция изменения чувствительность мыши
    mov cx,1 ; изменяем чувствительность мыши (по горизонтали)
    mov dx,1 ; изменяем чувствительность мыши (по вертикали)
    int 33h
    retf
    
button_right_click:
    mov ax,0fh ;функция изменения чувствительность мыши
    mov cx,8 ;уменьшаем чувствительность мыши до исходных 8(по горизонтали)
    mov dx,16 ; уменьшаем чувствительность мыши до исходных 16( по вертикали)
    int 33h
    retf
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
30.03.2022, 15:35
Там, ранее, при установке пользовательского обработчика в строке 14 должны указываться условия его вызова - нажатия или левой или правой кнопок.
0
0 / 0 / 0
Регистрация: 21.12.2018
Сообщений: 8
30.03.2022, 15:47  [ТС]
Спасибо большое за помощь. Получилось сделать.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
30.03.2022, 15:50
Лучший ответ Сообщение было отмечено johnkorotaev как решение

Решение

Здесь описания функций драйвера мыши
http://www.ctyme.com/intr/int-33.htm
Примерно так работает пользовательский обработчик прерывания
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
use16
section .text
org 0x100
main:
        ;проверка наличия мыши и её драйвера
        mov     ax,     0000h
        int     33h
        cmp     ax,     MouseInitOk
        je      .MouseInitOk
                mov     ah,     09h
                lea     dx,     [msgMouseFault]
                int     21h
                jmp     Exit
        .MouseInitOk:
        ;установка графического видеорежима
        mov     ax,     0012h
        int     10h
        ;установка формы графического курсора мыши
        mov     ax,     0009h
        mov     bx,     [MouseCursor_Arrow+64]
        mov     cx,     [MouseCursor_Arrow+66]
        lea     dx,     [MouseCursor_Arrow]
        push    cs
        pop     es
        int     33h
        ;установить пользовательский обработчик событий мыши
        mov     ax,     000Ch
        mov     cx,     MouseEvent_PressLeftButton + MouseEvent_PressRightButton
        push    cs
        pop     es
        lea     dx,     cs:[MouseHandler]
        int     33h
        ;показать курсор мыши
        mov     ax,     0001h
        int     33h
 
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
        mov     ah,     00h
        int     16h
        ;спрятать курсор мыши
        mov     ax,     0002h
        int     33h
        ;удалить пользовательский обработчик мыши
        mov     ax,     000Ch
        mov     cx,     MouseEvent_None
        int     33h
        ;восстановление текстового видеорежима
        mov     ax,     0003h
        int     10h
 
Exit:
        ;завершение программы
        mov     ax,     4C00h
        int     21h
 
;пользовательский обработчик "мыши"
;на входе:
;  АХ содержит условие вызова,
;  ВХ - состояние кнопок,
;  СХ, DX - X- и Y-координаты курсора,
;  SI, DI - счетчики последнего перемещения по горизонтали и вертикали
;           (единицы измерения для этих счетчиков - мики, 1/200 дюйма),
;  DS - сегмент данных драйвера мыши.
MouseHandler:
        test    ax,     MouseEvent_PressLeftButton
        jz      .Pressed_RightButton
.Pressed_LeftButton:
        mov     ax,     000Fh
        mov     cx,     1
        mov     dx,     1
        int     33h
retf
.Pressed_RightButton:
        ;по нажатию ПКМ восстанавливаем исходные значения
        mov     ax,     000Fh
        mov     cx,     8
        mov     dx,     16
        int     33h
retf
 
section .data
        ;Константы кода возврата инициализации "мыши"
        MouseInitOk                     equ     0FFFFh  ;инициализация мыши - успешна
        MouseInitFault                  equ     0000h   ;инициализация мыши - мышь или драйвер мыши не установлены
 
        MouseButtons_Any                equ     0000h   ;количество кнопок у мыши - отлично от 2 и 3
        MouseButtons_2                  equ     0002h   ;количество кнопок у мыши - 2
        MouseButtons_2_                 equ     0FFFFh  ;количество кнопок у мыши - 2
        MouseButtons_3                  equ     0003h   ;количество кнопок у мыши - 3
        ;Константы событий "мыши"
        MouseEvent_None                 equ     0000h   ;Удалить пользовательский обработчик
        MouseEvent_Move                 equ     0001h   ;любое перемещение
        MouseEvent_PressLeftButton      equ     0002h   ;нажатие левой кнопки
        MouseEvent_ReleaseLeftButton    equ     0004h   ;отпускание левой кнопки
        MouseEvent_PressRightButton     equ     0008h   ;нажатие правой кнопки
        MouseEvent_ReleaseRightButton   equ     0010h   ;отпускание правой кнопки
        MouseEvent_PressMiddleButton    equ     0020h   ;нажатие средней кнопки
        MouseEvent_ReleaseMiddleButton  equ     0040h   ;отпускание средней кнопки
        ;константы состояний кнопок мыши при опросе
        MouseButtons_PressLeft          equ     0001h
        MouseButtons_PressRight         equ     0002h
        MouseButtons_PressMiddle        equ     0004h
        ;Параметры курсоров мыши
        ;Курсор - перекрестие
        MouseCursor_Arrow               dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh  ;screen mask (AND mask)
                                        dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
                                        dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
                                        dw      0FFFFh, 0FFFFh, 0FFFFh, 0FFFFh
                                        dw      08000H, 0C000H, 0A000H, 09000H  ;cursor mask (XOR mask)
                                        dw      0A800H, 0B400H, 0BA00H, 0BD00H
                                        dw      0BE80H, 0BF40H, 0BFA0H, 0BFD0H
                                        dw      0BFE0H, 0AE00H, 0A300H, 0E300H
                                        dw      0                               ;column of cursor hot spot in bitmap (-16 to 16)
                                        dw      0                               ;row of cursor hot spot (-16 to 16)
        msgMouseFault   db      'The mouse or mouse driver was not detected.', 13, 10, '$'
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
Я думаю, что чувствительность всё же это функции 001Ah и 001Bh, а не как у вас 000Fh, но мне всё равно.
Если задание - изменять, то следует держать какие-то переменные с текущими значениями, т.к. то, что меняете вы при помощи функции 000Fh, у драйвера невозможно узнать текущие значения. Для доступа к ним придётся настраивать сегмент данных.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.03.2022, 15:50
Помогаю со студенческими работами здесь

Объект должен двигаться при нажатии на левую/правую часть экрана как в Flappy Bird (2d)
Объект должен двигаться при нажатии на левую/правую часть экрана, как в Flappy Bird, проект будет в 2d, помогите пжста

При нажатии кнопки мыши изменить цвет строки под курсором
Ассемблер. При нажатии кнопки мыши изменить цвет строки под курсором. Если лень писать код, дайте ссылку где можно почитать об...

При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой кнопки мыши красный квад
При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой кнопки мыши красный квадрат. При повторном...

Изменить цвет символов на следующий в палитре цветов при нажатии левой кнопки мыши
Всем привет! Задание: Изменить цвет символов на следующий в палитре цветов при нажатии левой кнопки мыши. Выход из программы –...

При нажатии на правую кнопку мыши
При нажатии на правую кнопку мыши отображается пустая белая рамка большого размера.Так же все стандартные программы(паинт,калькулятор..а...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru