Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 14.05.2019
Сообщений: 22
1
TASM

Не могу разобраться в том, как работает обработчик события мыши

04.06.2019, 13:29. Показов 4199. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу понять, как работает обработчик события мыши в ассемлере. В первом куске кода, как я понимаю, создали подпрограмму, которая при нажатии на лкм переходит к выполнению подпрограммы handler, верно?
Assembler
1
2
3
4
        mov         ax,000Ch     ; установить обработчик событий мыши
        mov         cx,0002h     ; событие - нажатие левой кнопки
        mov         dx,offset handler ; ES:DX - адрес обработчика
        int         33h
А handler в свою очередь уже что-то там делает. Я все правильно понимаю?

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
handler:
        push        0A000h
        pop         es           ; ES - начало видеопамяти
        push        cs
        pop         ds           ; DS - сегмент кода и данных этой программы
        push        сх           ; СХ (Х-координата) и
        push        dx           ; DX (Y-координата) потребуются в конце
 
        mov         ax, 2        ; спрятать курсор мыши перед выводом на экран
        int         33h
        cmp         word ptr previous_X,-1  ; если это первый вызов,
        je          first_point             ; только вывести точку,
 
        call        line_bresenham          ; иначе - провести прямую
exit_handler:
        pop         dx                      ; восстановить СХ и DX
        pop         сх
        mov         previous_X,cx           ; и запомнить их как предыдущие
        mov         previous_Y,dx           ; координаты
 
        mov         ax,1         ; показать курсор мыши
        int         33h
        retf                     ; выход из обработчика - команда RETF
По итогу мне нужно создать программу, которая определенным образом реагирует на нажатие лкм в определенной области, но как сделать это совсем не понимаю. В голове каша
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2019, 13:29
Ответы с готовыми решениями:

Не срабатывает обработчик события мыши
Почему-то не срабатывает обработчик события мыши. Вот код: var button = new SimpleButton();...

Обработчик события от мыши в PyQt5
Всем привет. Помогите разобраться со следующим моментом. В моем приложении есть два QWidget, как...

Обработчик события нажатия мыши в ListView
Народ, помогите, не могу понять как получить значение нажатой ячейки?? У меня на форме listView,...

Аффинная перестановка. Не могу разобраться в том, как действует шифр
На примере задачи Задача в файле 12312415.PNG В аналогичной задачи удалось найти a и b...

13
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
04.06.2019, 14:47 2
Цитата Сообщение от keldranace Посмотреть сообщение
которая определенным образом реагирует на нажатие лкм в определенной области, но как сделать это совсем не понимаю.
Твой handler будет вызываться только когда нажата левая клавиша мыши и при этом тебе в регистрах cx и dx будут передаваться координаты X и Y курсора мыши соответственно. Так-что
Assembler
1
2
3
4
5
6
7
8
9
10
    cmp cx, левая_граница_нужной_области
    jb  nechego_delat   ;переход если курсор левее области
    cmp cx, правая_граница_нужной_области
    ja  nechego_delat   ;переход если курсор правее области
    cmp dx, верхняя_граница_нужной_области
    jb  nechego_delat   ;переход если курсор выше области
    cmp dx, нижняя_граница_нужной_области
    ja  nechego_delat   ;переход если курсор ниже области
    ;делай чо те надо
nechego_delat:
3
0 / 0 / 0
Регистрация: 14.05.2019
Сообщений: 22
04.06.2019, 16:05  [ТС] 3
Ethereal, Спасибо. Пока ломаю голову, пытаюсь разобраться. Получился такой код, который пишет "привет", а после нажатия лкм пишет "привет снова".
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
.model tiny  ; Модель памяти для СОМ
.code        ; Начало сегмента кода       
  org 100h   ; Начальное значение счетчика - 100h
start:       
  mov ah,09               
  mov dx,offset mess       
  int 21h                  
  
        mov         ax,1         ; показать курсор мыши
        int         33h
        mov         ax,000Ch     ; установить обработчик событий мыши
        mov         cx,0002h     ; событие - нажатие левой кнопки
        mov         dx,offset handler ; ES:DX - адрес обработчика
        int         33h
        ;mov         ah,0         ; ожидание нажатия любой клавиши
        ;int         16h
        mov ah,01h
        int 21h
        mov al,00
        ret
handler:
        mov ah,09               
        mov dx,offset mess2       
        int 21h 
 
 
 
    mov ah,01h               
    int 21h
    mov ah,4ch
    int 21h
    ret  
 
mess   db  "Privet",0Dh,0Ah,'$'
mess2   db  "Privet again",0Dh,0Ah,'$'
                           
end start
Но по завершению работы программа "виснет", выводит кучу непонятных символов. Приходится перезапускать досбокс. Не подскажеь, с чем это может быть связано?
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
04.06.2019, 16:09 4
keldranace,
судя по фразе
Цитата Сообщение от keldranace Посмотреть сообщение
выводит кучу непонятных символов
впечатление такое, что ты создал ЕХЕ-программу, хотя в тексте программы
Цитата Сообщение от keldranace Посмотреть сообщение
Модель памяти для СОМ
0
0 / 0 / 0
Регистрация: 14.05.2019
Сообщений: 22
04.06.2019, 16:14  [ТС] 5
Mikl___, нет, программа линкуется ключами /x/t и на выходе получается .COM.
Немного изменил программу, добавил "retf" после вывода "hello again". В какую конкретно точку меня отсылает этот retf?
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
04.06.2019, 16:18 6
keldranace,
Вывод координат мыши на экран
0
0 / 0 / 0
Регистрация: 14.05.2019
Сообщений: 22
04.06.2019, 16:50  [ТС] 7
Mikl___, Спасибо, буду разбираться. Голова уже малость болит от ассемблера)
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
04.06.2019, 16:56 8
keldranace,
тут малой головной болью не отделаться, программирование на ассемблере это магия, которая требует полной отдачи
2
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
04.06.2019, 18:37 9
keldranace, ещё можете почитать в FAQ
Кратко о работе с мышью в DOS с помощью сервисного прерывания int 33h
1
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
05.06.2019, 07:14 10
Цитата Сообщение от keldranace Посмотреть сообщение
Не подскажеь, с чем это может быть связано?
Подскажу. Обработчик событий handler должен завершаться дальним возвратом из подпрограммы, а не ближним. Замени в его конце ret на retf

Добавлено через 6 минут
Или можно оставить ret , но оформить обработчик так :
handler PROС FAR
бла-бла-бла
ret
ENDP
Здесь ключевое словечко FAR надавит ассемблеру на мозг, чтобы он при компиляции втыкал не ближний ret (а он по умолчанию ближний), а дальний.

Короче, одно из двух.

Добавлено через 6 минут
Блин. Не заметил сразу. Нельзя завершать программу из обработчика. Ты что завершаешь-то ? Свою программу или драйвер мыши из которого был вызван обработчик ? Операционка грохнется от таких вольностей.
Убери из обработчика
Цитата Сообщение от keldranace Посмотреть сообщение
mov ah,4ch
int 21h
Обработчик должен завершиться по retf , а mov ah,4ch int 21h уместен в головной программе после ожидания нажатия клавиши, которое ты закомментировал.
1
0 / 0 / 0
Регистрация: 14.05.2019
Сообщений: 22
05.06.2019, 17:35  [ТС] 11
Ethereal, Спасибо, вроде кое-что начинаю понимать.
0
0 / 0 / 0
Регистрация: 14.05.2019
Сообщений: 22
06.06.2019, 00:01  [ТС] 12
Ethereal,
Программу немного переделал, но теперь вообще никак не работает.
Если просто запустить и дважды нажать любую клавишу, то программа без проблем завершиться. Если нажать лкм - встанет. В конце обработчика пробовал и ret и retf и через прыжок возвращаться к месту вызова. Ничего не помогает

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
SSEG    segment stack       
        db 256 dup(0)
SSEG    ends
 
DSEG    segment         
    mess   db 'Privet',0dh,0ah,'$'
    mess2  db 'Privet and ty for click!!!',0dh,0ah,'$'   
DSEG    ends
 
CSEG    segment         
        assume cs:CSEG,ds:DSEG,ss:SSEG
begin:
        mov ax, DSEG    
        mov ds,ax       
                      
        mov ah,09h                       
        mov dx,offset mess      ;privet  
        int 21h
 
        mov ax,000ch            ;set handler
        mov cx,0002h            ;
        mov dx,offset click_handler
        int 33h 
        
        mov ah,01h      
        int 21h 
        
        mov ax,000ch
        mov cx,0000h
        
        mov ah,01h      
        int 21h                              
        mov ah,4ch      
        int 21h 
                         
click_handler:
        mov ah,09h                       
        mov dx,offset mess2 
        int 21h
        retf
        
        
        
CSEG    ends        
end begin
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
06.06.2019, 01:15 13
Лучший ответ Сообщение было отмечено keldranace как решение

Решение

Ать.
Цитата Сообщение от keldranace Посмотреть сообщение
click_handler:
mov ax,DSEG
mov ds,ax

mov ah,09h
mov dx,offset mess2
int 21h
retf
Добавлено через 1 минуту
И два.
Цитата Сообщение от keldranace Посмотреть сообщение
push cs
pop es

mov ax,000ch ;set handler
mov cx,0002h ;
mov dx,offset click_handler
int 33h
Добавлено через 9 минут
Про ать :
При входе в обработчик ds какой попало. И сказано :

Созданный таким образом драйвер событий должен позаботиться о правильной установке регистра DS. Однако драйвер событий не обязан сохранять и восстанавливать содержимое регистра DS и других регистров процессора.

Про два :
Это в com-программе при запуске cs=ds=es=ss=PSP. А в exe ds=es=PSP , но cs указывает на сегмент кода, а ss на сегмент стека, которые иные чем PSP. А тебе в функцию установки обработчика надо передать адрес обработчика в виде es:dx. Но es у тебя указывал на PSP, а не на сегмент кода.
1
0 / 0 / 0
Регистрация: 14.05.2019
Сообщений: 22
07.06.2019, 17:29  [ТС] 14
Ethereal,
Шикарно, спасибо.
Окончательно разобрался с тем, как работает обработчик событий мыши.
Теперь буду думать над остальной частью программы
0
07.06.2019, 17:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2019, 17:29
Помогаю со студенческими работами здесь

Обработчик события нажатия кнопки мыши для dataGridView
Здравствуйте=) помогите пожалуйста с решением вот этой задачи: для таблиц DataGridView создается...

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

Создайте обработчик события нажатия кнопки мыши на форме (Click), который будет очищать поле ввода
Делаю лабу: Разместите на форме поле ввода (TextBox), метку (Label) и кнопку (Button). Создайте...

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


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

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