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

Обменять верхнюю и нижнюю части экрана по нажатию левой кнопки мыши

13.06.2017, 10:23. Показов 1837. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание:
Заполнить 0-вую строку видеопамяти любым текстом. При нажатии на леву клавишу мышки содержание верхней и нижней части экрана меняются местами. Основная программа реализуется согласно Примеру 1.
Требования к процедуре обработки событий:
- Процедура должна быть типа far
- В процедуре необходимо сохранить в стеке содержимое регистров, используемых с последующим восстановлением содержимого регистров перед возвращением
- В процедуре необходимо установить свои значения сегментных регистров для данных поскольку драйвер мышки "не знает" с которыми сегментами работает программа пользователя
Пример организации процедуры prmaus:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
prmaus  proc        far
; сохранение содержимого регистров ds, es та  РЗП
push        ds    
push        es
pusha
;загрузка  сегментных регистров ds та  es
push        0b800h ; сегментный адрес видеобуфера
pop         es  
push        _data ; 
pop ds
;основное тело процедуры:
;
popa
pop         es
pop         ds
ret
prmaus  endp
Пример 1:
Одним из самых простых алгоритмов основной программы является ожидание ввода произвольного символа с клавиатуры ПЭВМ с последующим окончанием работы программы.
Assembler
1
2
3
mov         ah, 01h ; ввести символ с клавиатуры ПЭВМ
int     21h     ; вызов функции DOS 
jmp     exit
Очень нужна помощь, так так в Ассемблере я ни бум-бум, а задание как то надо выполнить.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.06.2017, 10:23
Ответы с готовыми решениями:

Обменять верхнюю и нижнюю части экрана по нажатию левой кнопки мыши
Доброго времени суток! Нужна программа, которая заполнит 0-ю страницу видеопамяти произвольным текстом. При нажатии на левую кнопку мыши...

Автокликер (по нажатию левой кнопки мыши)
Вообщем нужно сделать простенький автокликер, в секунду кликал 15-18 кликов желательно что-бы присутствовал рандом то 14 кликов то 15, но в...

Рисование в Delphi по нажатию левой кнопки мыши
Всем привет, как сделать так, чтобы рисование производилось в процедурах PicMouseDown и PicMouseMove по зажатию левой кнопки мыши, а не по...

7
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,921
Записей в блоге: 13
13.06.2017, 23:46
Примеры
FAQ для раздела Assembler, MASM, TASM
Управление манипулятором мышь - изменение формы курсора в зависимости от координат.
Удаление элементов по нажатию левой клавиши мыши
При нажатии на правую кнопку мышки, содержимое чётных и нечётных столбцов экрана обменять местами
Вывод текстового файла на экран. Цветовая "подсветка" символов. Изменение цвета фона мышью.
Переключение видеостраниц при нажатии левой кнопки мыши

Все эти примеры - суть одна программа с минимальными изменениями обработчика.

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

Не по теме:

Фразой

Цитата Сообщение от SlyMarii Посмотреть сообщение
в Ассемблере я ни бум-бум, а задание как то надо выполнить.
вы мне напомнили одного рядового - в далёком 1996 он ночевал на стройке, где я работал сторожем, и рассказывал, что вместе с сержантом и офицером продавал автоматы боевикам и мотивировал это (дословно): "Жить-то надо!".



Добавлено через 9 часов 51 минуту
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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
LOCALS  @@
 
.model small
 
.stack 100h
 
.data
        ;коды клавиш
        KeyCode_Esc                     equ     1Bh     ;Esc
 
        ;Константы событий "мыши"
        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   ;отпускание средней кнопки
 
        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
 
        ;сообщения программы
        msgMouseFault                   db      'The mouse or mouse driver was not detected.', 13, 10, '$'
        msgPressEscToExit               db      'Press ESC to exit...', '$'
 
.code
 
;Ожидание нажатия клавиши на клавиатуре
;вход
; - нет
;выход
;ax - al - ASCII код нажатой клавиши, ah - скан-код
ReadKey         proc
        mov     ah,     00h
        int     16h
        ret
ReadKey         endp
 
;Инициализация работы с "мышью"
;Выполняется аппаратный и программный сброс мыши и драйвера
;вход
; - нет
;выход
;ax - результат инициализации
;   = 0000h, если мышь или драйвер мыши не установлены
;   = FFFFh, если драйвер и мышь установлены
;bx - число кнопок
;   = 0002 или FFFF - две
;   = 0003 - три
;   = 0000 - другое количество
MouseInit       proc
        mov     ax,     0000h
        int     33h
        ret
MouseInit       endp
;Показать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseShowCursor proc
        push    ax
        mov     ax,     0001h
        int     33h
        pop     ax
        ret
MouseShowCursor endp
 
;Спрятать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseHideCursor proc
        push    ax
        mov     ax,     0002h
        int     33h
        pop     ax
        ret
MouseHideCursor endp
 
;Установить/удалить обработчик событий от "мыши"
;вход
;ES:DX = адрес обработчика
;СХ = условие вызова
;   бит 0 — любое перемещение мыши
;   бит 1 — нажатие левой кнопки
;   бит 2 — отпускание левой кнопки
;   бит 3 — нажатие правой кнопки
;   бит 4 — отпускание правой кнопки
;   бит 5 — нажатие средней кнопки
;   бит 6 — отпускание средней кнопки
;СХ = 0000h — отменить обработчик;выход
;выход
; - нет
MouseSetHandler proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    es
 
        mov     ax,     000Ch
        int     33h
 
        pop     es
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
MouseSetHandler endp
 
;Обработчик событий "мыши"
;вход
;АХ содержит условие вызова,
;ВХ - состояние кнопок,
;СХ, DX - X- и Y-координаты курсора,
;SI, DI - счетчики последнего перемещения по горизонтали и вертикали
;      (единицы измерения для этих счетчиков - мики, 1/200 дюйма),
;DS - сегмент данных драйвера мыши.
;выход
; - нет
MyMouseHandler  proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    es
 
        call    MouseHideCursor
        call    ExchangeHalfScreen
        call    MouseShowCursor
@@Exit:
        pop     es
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        retf
MyMouseHandler  endp
 
;Заполнение экрана символами
FillScreen      proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    es
 
        mov     ax,     0B800h
        mov     es,     ax
        mov     si,     0
 
 
        mov     bl,     0       ;символ
        mov     bh,     0       ;цвет
        mov     cx,     24*80   ;количество знакомест на экране
        and     bx,     0F1Fh
@@For:
        mov     ax,     bx
        add     al,     'A'
        add     ah,     3       ;цвет фона делаем отличным от цвета символа
        and     ah,     07h
        shl     ah,     1
        shl     ah,     1
        shl     ah,     1
        shl     ah,     1
        or      ah,     bh      ;к цвету фона добавляем цвет символа
 
        mov     es:[si],ax      ;записываем символ и его атрибут (цвета)
        add     si,     2       ;переходим к следующему адресу символа на экране
 
        add     bx,     0101h   ;изменяем цвет и номер выводимого символа
        and     bx,     0F1Fh
        cmp     bh,     1
        adc     bh,     0
        cmp     bl,     1
        adc     bl,     0
 
        loop    @@For
 
        mov     ah,     02h
        mov     bh,     0       ;видеостраница
        mov     dl,     0       ;столбец (от 0)
        mov     dh,     24      ;строка (от 0)
        int     10h
        mov     ah,     09h
        lea     dx,     msgPressEscToExit
        int     21h
 
        pop     es
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
FillScreen      endp
 
;заменить на экране верхнюю и нижнюю половины экрана
ExchangeHalfScreen      proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    es
 
        mov     ax,     0B800h
        mov     es,     ax
        mov     si,     0
        mov     di,     13*80*2
 
        mov     cx,     12*80
 
@@For:
        xchg    ax,     es:[si]
        xchg    ax,     es:[di]
        xchg    ax,     es:[si]
 
        add     si,     2
        add     di,     2
 
        loop    @@For
 
        pop     es
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ExchangeHalfScreen      endp
 
;основная программа
main            proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;попытка инициализации мыши
        call    MouseInit
        cmp     ax,     MouseInitOk
        je      @@MouseInitOk
        ;если инициализация не удалась - вывести сообщение
        ;и завершить программу
        mov     ah,     09h
        lea     dx,     msgMouseFault
        int     21h
        jmp     @@Exit
 
@@MouseInitOk:
        ;установить пользовательский обработчик событий "мыши"
        push    es
        mov     ax,     seg MyMouseHandler
        mov     es,     ax
        mov     dx,     offset  MyMouseHandler
        mov     cx,     MouseEvent_PressLeftButton
        call    MouseSetHandler
        pop     es
        ;заполнить экран
        call    FillScreen
        ;показать курсор
        call    MouseShowCursor
        ;цикл ожидания нажатия кнопки ESC
        ;в цикле проверяется работа обработчика мыши
@@WaitEscapePressed:
        call    ReadKey
        cmp     al,     KeyCode_Esc
        jne     @@WaitEscapePressed
        ;убрать курсор с экрана
        call    MouseHideCursor
        ;удалить пользовательский обработчик прерывания
        mov     cx,     MouseEvent_None
        call    MouseSetHandler
 
@@Exit:
        mov     ax,     4C00h
        int     21h
main            endp
 
end     main
0
0 / 0 / 1
Регистрация: 06.04.2016
Сообщений: 17
22.06.2017, 21:20  [ТС]
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
CODE SEGMENT
    ASSUME  CS:CODE
_start:
    mov     AX, 3
    
    int     10h
 
    mov     BX, 0b800h    
    mov     ES, BX
 
    mov     AL, '0'      
    mov     AH, 00000111b  
 
    xor     BX, BX
    xor     DX, DX
    xor     CX, CX
 
    jmp _loop
    tmp     DW  160 dup(0)
    lolka   db  0
_loop:
        mov     ES:[BX], AX      
        add     BX, 2        
        add     DX, 2
        cmp     DX, 40 * 2 * 2    
        jb      _loop
        xor     DX, DX
 
        inc     CX
        cmp     CX, 12     
        jb      _loop
    
        cmp     AL, '1'
        je  @1
  
        mov     AL, '1'
        xor     CX, CX
        jmp     _loop
    
@1: 
    mov     ax, 0ch ; встановити режим обробки подій
; від мишки
    mov cx, 10b     ; вибрати в якості події будь-яке 
; переміщення мишки  (біт 0=1) або натискання лівої кнопки (біт1=1)
    push    es      ;зберегти вміст сегментного регістра 
    push    cs
    pop     es      ; вважаєм, що процедура користувача
; для обробки подій від мишки знаходиться 
;в поточному сегменті кодів
    lea     dx, prmaus; встановити зміщення процедури
; обробки подій від мишки в сегменті кодів
    int     33h     ; регістрація адреси та умов виклику
    pop     es
 
    mov     ah, 01h ; ввести символ з клавіатури ПЕОМ
    int 21h     ; виклик функції DOS 
    jmp _exit
   
prmaus  proc    far
; збереження вмісту регістрів ds, es та  РЗП
    push    ds    
    push    es
;завантаження  сегментних регістрів ds та  es
    pop     es  
    pop     ds
;основне тіло процедури:
_infinity:
        xor     bx, bx
_action:      
        mov     CX, CS
        mov     ES,  CX 
    ; ES:DI <- [tmp]
        lea     DI, tmp
        ; DS:SI <- 0b800h:0
        mov     CX, 0b800h
        mov     DS, CX
      
        mov     SI, bx 
     
        xor     CX, CX
        mov     CX, 80
        rep     movsw
        ; ES:DI <- 0b800h:0
        mov     DI, bx 
     
        xor     CX, CX
        mov     CX, 0b800h
        mov     ES, CX
 
        ; DS:SI <- 0b800h: 12 * 160
        mov     DS, CX
      
        mov     SI, bx
        mov     CX, 12 * 160    
        add     si, CX
        mov     CX, 80        
        rep     movsw
        mov     CX, CS
        mov     DS,  CX
        ; DS:SI <- [tmp]
        lea     SI, tmp
        ; ES:DI <- 0b800h: 12 * 160
        mov     DI, bx
        mov     CX, 12 * 160
        add     di, CX
        mov     CX, 0b800h
        mov     ES, CX
        mov     CX, 80
        rep     movsw
        add     BX, 160 
        cmp     BX, 12 * 160
        jl  _action
 
    pop     es
    pop     ds
    ret
prmaus  endp
  
    mov     ah, 01h ; ввести символ з клавіатури ПЕОМ
    int 21h ; виклик функції DOS 
    jmp _exit
    
_exit:
 
    mov     AX,  4c00h
    int     21h
 
CODE    ENDS
end _start
Я попыпалась сделать вот так, но есть но:
оно не реагирует на повторные нажатия левой клавишы, да и когда нажимаешь ESC, программа не реагирует
Когда я ставлю pusha и popa , то выдает ошибки
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,921
Записей в блоге: 13
22.06.2017, 21:32
в процедуре обработчика не сохраняются регистры и флаги. Это разрушает ход программы.
0
0 / 0 / 1
Регистрация: 06.04.2016
Сообщений: 17
22.06.2017, 21:41  [ТС]
как его исправить?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,921
Записей в блоге: 13
22.06.2017, 22:21
Возьмите мой готовый вариант. Ваш долго исправлять. Нужно вникать и отлаживать и в итоге, я сделаю его опять, как в моём варианте.
0
0 / 0 / 1
Регистрация: 06.04.2016
Сообщений: 17
22.06.2017, 22:23  [ТС]
Увы, ваш код у меня не компилируется
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,921
Записей в блоге: 13
22.06.2017, 22:30
А так
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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
sseg    segment para stack
    db  100h dup(?)
sseg    ends
 
@data   segment public
        ;коды клавиш
        KeyCode_Esc                     equ     1Bh     ;Esc
 
        ;Константы событий "мыши"
        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   ;отпускание средней кнопки
 
        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
 
        ;сообщения программы
        msgMouseFault                   db      'The mouse or mouse driver was not detected.', 13, 10, '$'
        msgPressEscToExit               db      'Press ESC to exit...', '$'
@data   ends
 
@code   segment
 
    assume  cs:@code, ds:@data, ss:sseg
;Ожидание нажатия клавиши на клавиатуре
;вход
; - нет
;выход
;ax - al - ASCII код нажатой клавиши, ah - скан-код
ReadKey         proc
        mov     ah,     00h
        int     16h
        ret
ReadKey         endp
 
;Инициализация работы с "мышью"
;Выполняется аппаратный и программный сброс мыши и драйвера
;вход
; - нет
;выход
;ax - результат инициализации
;   = 0000h, если мышь или драйвер мыши не установлены
;   = FFFFh, если драйвер и мышь установлены
;bx - число кнопок
;   = 0002 или FFFF - две
;   = 0003 - три
;   = 0000 - другое количество
MouseInit       proc
        mov     ax,     0000h
        int     33h
        ret
MouseInit       endp
;Показать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseShowCursor proc
        push    ax
        mov     ax,     0001h
        int     33h
        pop     ax
        ret
MouseShowCursor endp
 
;Спрятать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseHideCursor proc
        push    ax
        mov     ax,     0002h
        int     33h
        pop     ax
        ret
MouseHideCursor endp
 
;Установить/удалить обработчик событий от "мыши"
;вход
;ES:DX = адрес обработчика
;СХ = условие вызова
;   бит 0 — любое перемещение мыши
;   бит 1 — нажатие левой кнопки
;   бит 2 — отпускание левой кнопки
;   бит 3 — нажатие правой кнопки
;   бит 4 — отпускание правой кнопки
;   бит 5 — нажатие средней кнопки
;   бит 6 — отпускание средней кнопки
;СХ = 0000h — отменить обработчик;выход
;выход
; - нет
MouseSetHandler proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    es
 
        mov     ax,     000Ch
        int     33h
 
        pop     es
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
MouseSetHandler endp
 
;Обработчик событий "мыши"
;вход
;АХ содержит условие вызова,
;ВХ - состояние кнопок,
;СХ, DX - X- и Y-координаты курсора,
;SI, DI - счетчики последнего перемещения по горизонтали и вертикали
;      (единицы измерения для этих счетчиков - мики, 1/200 дюйма),
;DS - сегмент данных драйвера мыши.
;выход
; - нет
MyMouseHandler  proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    es
 
        call    MouseHideCursor
        call    ExchangeHalfScreen
        call    MouseShowCursor
 
        pop     es
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        retf
MyMouseHandler  endp
 
;Заполнение экрана символами
FillScreen      proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    es
 
        mov     ax,     0B800h
        mov     es,     ax
        mov     si,     0
 
 
        mov     bl,     0       ;символ
        mov     bh,     0       ;цвет
        mov     cx,     24*80   ;количество знакомест на экране
        and     bx,     0F1Fh
@@For:
        mov     ax,     bx
        add     al,     'A'
        add     ah,     3       ;цвет фона делаем отличным от цвета символа
        and     ah,     07h
        shl     ah,     1
        shl     ah,     1
        shl     ah,     1
        shl     ah,     1
        or      ah,     bh      ;к цвету фона добавляем цвет символа
 
        mov     es:[si],ax      ;записываем символ и его атрибут (цвета)
        add     si,     2       ;переходим к следующему адресу символа на экране
 
        add     bx,     0101h   ;изменяем цвет и номер выводимого символа
        and     bx,     0F1Fh
        cmp     bh,     1
        adc     bh,     0
        cmp     bl,     1
        adc     bl,     0
 
        loop    @@For
 
        mov     ah,     02h
        mov     bh,     0       ;видеостраница
        mov     dl,     0       ;столбец (от 0)
        mov     dh,     24      ;строка (от 0)
        int     10h
        mov     ah,     09h
        lea     dx,     msgPressEscToExit
        int     21h
 
        pop     es
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
FillScreen      endp
 
;заменить на экране верхнюю и нижнюю половины экрана
ExchangeHalfScreen      proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    es
 
        mov     ax,     0B800h
        mov     es,     ax
        mov     si,     0
        mov     di,     13*80*2
 
        mov     cx,     12*80
 
@@@For:
        xchg    ax,     es:[si]
        xchg    ax,     es:[di]
        xchg    ax,     es:[si]
 
        add     si,     2
        add     di,     2
 
        loop    @@@For
 
        pop     es
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ExchangeHalfScreen      endp
 
;основная программа
main            proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;попытка инициализации мыши
        call    MouseInit
        cmp     ax,     MouseInitOk
        je      @@MouseInitOk
        ;если инициализация не удалась - вывести сообщение
        ;и завершить программу
        mov     ah,     09h
        lea     dx,     msgMouseFault
        int     21h
        jmp     @@Exit
 
@@MouseInitOk:
        ;установить пользовательский обработчик событий "мыши"
        push    es
        mov     ax,     seg MyMouseHandler
        mov     es,     ax
        mov     dx,     offset  MyMouseHandler
        mov     cx,     MouseEvent_PressLeftButton
        call    MouseSetHandler
        pop     es
        ;заполнить экран
        call    FillScreen
        ;показать курсор
        call    MouseShowCursor
        ;цикл ожидания нажатия кнопки ESC
        ;в цикле проверяется работа обработчика мыши
@@WaitEscapePressed:
        call    ReadKey
        cmp     al,     KeyCode_Esc
        jne     @@WaitEscapePressed
        ;убрать курсор с экрана
        call    MouseHideCursor
        ;удалить пользовательский обработчик прерывания
        mov     cx,     MouseEvent_None
        call    MouseSetHandler
 
@@Exit:
        mov     ax,     4C00h
        int     21h
main            endp
 
@code   ends
 
end     main
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2017, 22:30
Помогаю со студенческими работами здесь

Появление рисунка по нажатию левой кнопки мыши
Всем привет!Я хотел у вас поинтересоваться,как реализовать следующее: Нажатие левой кнопки мыши -&gt; появление рисунка Просто я уже...

Как реализовать комбо атаки по нажатию левой кнопки мыши?
есть три анимации для удара персонажа, обрабатываю атаку в скрипте по нажатию на Mouse0, как можно попроще реализовать механизм - игрок...

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

Смена картинки в picturebox winforms по нажатию правой/левой кнопки мыши
как реализовать смену картинки по правому или левому/нажатию кнопки мыши? Помогите плиз

Клики левой кнопки мыши по таймеру, при зажатой левой кнопке мыши (user32.lib)
Уважаемые форумчане, взорвался мозг. Помогите. Есть одна, по мне, невыполнимая, задача, которую я уже очень долго не могу решить. Мне...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru