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

Программа, которая опрашивает текущее состояние мыши

05.12.2009, 22:45. Показов 1427. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот программа,которая опрешивает текущее состояние мыши. И в зависимости от результата выводит сообщение на экран, о том,какая кнопка нажата. Программа должна быть зациклина(Работает,пока не нажаты левая и правая одновременн.
Но при выводе на экран,когда нажали один раз кнопку,она много раз выдает сообщение.Как сделать,чтобы выдавало один раз "правая" "левая"? Помогите плиз что дописать в коде?
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
s_s segment stack "stack"            
    dw 10 dup (?)                    
s_s ends                            
;=============================
d_s segment                            
str1  db ' ustanovite driver$'        
str2  db ' left$'                    
str3  db ' right$'                    
str4  db ' middle$'
str5  db ' both$'    
d_s ends                            
;=============================
c_s segment                            
assume ss:s_s, ds:d_s, cs:c_s        
;-----------------------------------------------------
start:    mov ax, d_s                    
        mov ds,ax                    
        mov ax,0                    
        int 33h                        
        cmp ax,0                     
        mov ax,1                    
        int 33h                        
;-----------------------------------------------------
a0:        mov bx,0                    
        mov ax,3                     
        int 33h                        
        cmp bx,0                    
        jz a0                        
        cmp bx,1                    
        jz a2                         
        cmp bx,2                    
        jz a3                        
        cmp bx,4                    
        jz a4                        
        cmp bx,3                    
        jz a5                        
        jmp a0                        
;-----------------------------------------------------
a4:        mov ah, 9                    
        lea dx, str4                
        int 21h                        
        jmp a0                        
;-----------------------------------------------------
a5:        mov ah, 9                    
        lea dx, str5                
        int 21h                        
        jmp kon                    
;-----------------------------------------------------
a3:        mov ah, 9                    
        lea dx, str3                
        int 21h                        
        jmp a0                
;-----------------------------------------------------
a2:        mov ah, 9                    
        lea dx, str2                
        int 21h                        
        jmp a0                        
;-----------------------------------------------------
a1:        mov ah, 9                    
        lea dx, str1                
        int 21h                        
;-----------------------------------------------------
kon:    mov ah, 4ch                    
;------------------------------------------------------------------------
c_s ends                            
;=============================
end start
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2009, 22:45
Ответы с готовыми решениями:

Как отследить текущее состояние мыши?
По событию OnMouseDown залетаю в свою процедуру, и при этом мне надо находиться здесь до отпускания...

текущее состояние сокета
здравствуйте! никто не подскажет как можно проверить текущее состояние сокета, точнее даже будет...

TTimer текущее состояние
Добрый день, Возникла такая проблемка, запускаю таймер и нужно по нажатию узнать сколько он...

Текущее состояние дел
Итак. Дело с новой партией худо бедно пошло. Поставщики комплектухи почти вышли из новогоднего...

6
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
05.12.2009, 22:52 2
Поменяйте
Assembler
1
jmp a0
на
Assembler
1
jmp kon
0
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
16.07.2014, 04:52 3
Goodwin98,
твое изменение не соответствует условию задания. по твоему варианту обработается только одно нажатие какой-либо кнопки и программа пойдет на выход. а в задании требуется, чтобы программа была зациклена. я нашел решение этой проблемы в выводе сообщений в текстовом режиме. сам метод - стирание предыдущего значения по одному символу (вместе с этим перемещается и курсор в начальное положение в итоге), а затем запись нового значения тоже посимвольно. в этом случае на дисплее будет отображаться только одно слово, соответствующее значению.

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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
.model small
.386
 
.data
    db 'Bebin Of Data',0        
str1  db ' left$'                    
str2  db ' right$'   
str3  db ' both$'               
str4  db ' middle$'
str5  db ' install driver$' 
adr   dw ?                      
    db 'End Of Data'
    
.stack
    db  0FFh
    
.code
start:
    mov ax,@data
    mov ds,ax
 
    ;переход в текстовый режим
    mov ah,00h
    mov al,03h
    int 10h
    
    ;инициализация мыши
    xor ax,ax                    
    int 33h
    
    ;проверка на установленность драйвера мыши
    test ax,ax
    jz a5
    
    ;включить курсор мыши
    mov ax,01h                    
    int 33h                        
    
    ;переместить курсор в самое начало
    mov ah,02h
    mov bh,00h
    mov dh,00h
    mov dl,00h
    int 10h
    
    a0: 
    mov bx,00h
    
    ;запоминаем в dx координаты курсора, т.к. после
    ;функции 03 int 33h dx изменится 
    push dx 
    
    
    mov ax,03h                     
    int 33h
    
    pop dx
    
    ;определяем какая кнопка была нажата
    cmp bx,00h                    
    jz a0                        
    cmp bx,01h                    
    jz a1                        
    cmp bx,02h                    
    jz a2
    cmp bx,03h                    
    jz a3
    cmp bx,04h                    
    jz a4                                                
    jmp a0                        
 
    a1:
    ;стираем предыдущее значение
    mov cx,dx
    push cx
    call rubber
    
    
    ;записываем новое значение
    mov cx,05h
    lea si,str1
    
    push cx
    push si
    call print
    
    ;возвращаемся, чтобы ловить новую кнопку
    jmp a0
    
    a2: 
    ;стираем предыдущее значение
    mov cx,dx
    push cx
    call rubber
    
    ;записываем новое значение
    mov cx,06h
    lea si,str2
    
    push cx
    push si
    call print
    
    jmp a0
    
    a3: 
    ;стираем предыдущее значение
    mov cx,dx
    push cx
    call rubber
    
    ;записываем новое значение
    mov cx,05h
    lea si,str3
    
    push cx
    push si
    call print
    
    jmp kon
    
    a4: 
    ;стираем предыдущее значение
    mov cx,dx
    push cx
    call rubber
    
    ;записываем новое значение
    mov cx,07h
    lea si,str4
    
    push cx
    push si
    call print
    
    jmp a0                        
 
    a5:        
    ;стираем предыдущее значение
    mov cx,dx
    push cx
    call rubber
 
    ;записываем новое значение
    mov cx,0Fh
    lea si,str5
    
    push cx
    push si
    call print
 
    kon:
    mov ah,4Ch
    int 21h
    
    rubber proc
        push bp
        mov bp,sp
        mov cx,[bp+4]
        
        ;чтобы цикл стирания не пошел, если курсор
        ;находится в начале координат
        test cx,cx
        jz empty
        
        do:
        push cx
        ;стираем по одному символу
        mov ah,09h
        mov al,20h
        mov bh,00h
        mov bl,00h
        mov cx,01h
        int 10h
        
        ;перемещаемя на один символ назад
        mov ah,02h
        mov dh,00h
        dec dl
        int 10h
        pop cx
        loop do
        
        empty:
        pop bp
        pop adr
        add sp,2
        push adr
        
        ret
    rubber endp
    
    print proc
        push bp
        mov bp,sp
        mov si,[bp+4]
        mov cx,[bp+6]
    
        print_a1:
        push cx
        
        ;пишем по одному символу из значения
        mov ah,09h
        mov al,byte ptr [si]
        mov bh,00h
        mov bl,0Ah
        mov cx,01h
        int 10h
        
        inc si
        
        ;перемещаемся на один символ вперед
        mov ah,02h
        mov dh,00h
        inc dl
        int 10h
        
        pop cx
        loop print_a1
        
        pop bp
        pop adr
        add sp,4
        push adr
        
        ret
    print endp
end start
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
16.07.2014, 12:29 4
proc3nt, Кмк, так проще.
1
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
16.07.2014, 18:03 5
Charles Kludge,
по задумке здорово, но есть пару моментов на которые хочу обратить твое внимание:
в данной тобой задаче по-моему нужно показывать курсор сразу же после инициализации мыши. т.к. если использовать теперешний вариант будет затираться регистр ax. после того ведь как мы установили обработчик событий - АХ содержит условие вызова, который далее будет использоваться при обработке кнопок btn.
еще один момент, на который обратил внимание - почему-то при обработке левой и правой кнопок используется test с регистром ax, а при обработке средней кнопки - test с регистром bx.
1
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
16.07.2014, 18:27 6
proc3nt, это не последний вариант. Тынц. А вот за BX - спасибо, т.к. у меня средняя кнопка в консоли не работает.
0
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
16.07.2014, 20:14 7
очень уж много кода. пока только потестировал вариант Тынц и заметил, что если поводить курсор мыши по дисплею, то появляется серьезный сбой при нахождении координат (в произвольных местах, но особенно когда первое число достигает цифры 639 и мышь далее ведется вниз).
также в assume не указывается об сегменте стека. думаю надо добавить
Assembler
1
assume  cs:ddd,ds:ddd,ss:ddd
но сейчас я не скажу повлияет ли это как-то на работу кода.

Добавлено через 8 минут
да, не упомянул.. серьезный сбой - переполнение деления
0
16.07.2014, 20:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.07.2014, 20:14
Помогаю со студенческими работами здесь

Определить текущее состояние дескриптора
По имеющемуся дескриптору объекта можно определить его текущее состояние. Это делается с помощью...

Проверить текущее состояние клавиши
Собственно делаю прогу и надо проверить состояние клавиши NumLock без использования...

MediaElement. Не определяет текущее состояние
Здравствуйте. Делаю плеер. Есть кнопка при нажатии на которую плеер будет либо останавливаться,...

Текущее состояние только для чтения:Да
такая же проблема, что может быть не пойму, уважаемые может кто знает как решить эту проблему? на...


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

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