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

Нажимая на левую кнопку мышки очистить нечетные колонки экрана, а при нажатии на правую кнопку - чётные колонки экрана

09.06.2020, 18:40. Показов 1262. Ответов 2

Студворк — интернет-сервис помощи студентам
Задание: Заполнить 0-ю страницу видеопамяти произвольным текстом. Нажимая на левую кнопку мышки очистить нечетные колонки экрана, а при нажатии на правую кнопку - парные колонки экрана. При повторном нажатии на кнопку содержание соответствующей части экрана должно восстанавливаться

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
code segment
assume cs:code
jmp begin
 
action macro  itr, chr, sign, kf
mov cx, itr
    mov ah,03h
    mov al, chr
sign:
    mov word ptr es:[di],ax
    add di,kf
loop sign
endm
 
begin:     
mov ax, 3
int 10h
mov    ax,0B800h
mov    es,ax
xor di,di
action  2000, '+',sign1, 2
mov ax, 0   
int 33h
mov ax, 1
int 33h
mov ax,000ch
mov cx,00001010b
mov dx, offset mouse
int 33h
mov ah,0
int 16h
mov ax,000ch    
mov cx,0000h
int 33h
mov ax,3    
int 10h 
mov ah,4ch
int 21h
 
mouse:
xor ax,ax
start:
test bx, 00000010b ;нажата ли правая клавиша
jz  parn
xor di,di   ; для нечетных значений (прямое обращение к видеопамяти)
jmp continue
parn:
mov di, 2
continue:
cmp ax, 1   ;клавиша нажата дважды
jz final
mov ax, 1
action 1000, ' ', sign2, 4 
jmp start
final:
action 1000, '+', sign3, 4 
retf
 
code ends
end begin
Проблема: Мышь отображается в консоли. Если не задействовать обработчик mouse, то при нажатии на клавиатуру прога завершается, в ином случае зависание (+ текст не изменяется). Комментировал тело обработчика - реакция та же.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.06.2020, 18:40
Ответы с готовыми решениями:

При нажатии на правую кнопку мышки, содержимое чётных и нечётных столбцов экрана обменять местами
Доброго времени суток! Есть задача: 1) заполнит 0-ю страницу видеопамяти произвольным текстом 2) при нажатии на ПКМ менять местами...

При нажатии на правую кнопку мышки, содержимое чётных и нечётных столбцов экрана обменять местами.
Задание: Заполнить 0-ю страницу видеопамяти любым текстом. При нажатии на правую кнопку мышки содержание парных и непарных столбцов...

При нажатии на правую кнопку мышки содержание левой и правой части экрана меняются местами
.386 CODE SEGMENT use16 ASSUME CS:CODE _start: mov AX, 3 int 10h mov BX, 0b800h mov ES, BX

2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8646 / 4481 / 1669
Регистрация: 01.02.2015
Сообщений: 13,889
Записей в блоге: 11
09.06.2020, 20:32
Чтобы макрос с внутренними метками многократно использовать - применяйте директиву LOCAL
Assembler
1
2
3
4
5
6
7
mymacro macro count
  local @@for
  mov cx, count
  @@for:
    add ax, bx
  loop @@for
endm
Очистку лучше организовать так:
1. объявить переменную - буфер экрана - размером 80*25*2 байт
2. объявить две переменные, указывающие направление перемещения четных и нечётных колонок - в буфер или в видеобуфер.
3. в обработчике анализировать нажатие кнопки и направление перемещения.

Тема работы с мышью при помощи пользовательского обработчика неоднократно рассматривалась.
Теория, пояснения
FAQ для раздела Assembler, MASM, TASM
Реализация этой теории
- в текстовом режиме
Удаление элементов по нажатию левой клавиши мыши
При нажатии на правую кнопку мышки, содержимое чётных и нечётных столбцов экрана обменять местами.
Вывод текстового файла на экран. Цветовая "подсветка" символов. Изменение цвета фона мышью.
Переключение видеостраниц при нажатии левой кнопки мыши
Переключение видеостраниц при нажатии левой кнопки мыши
Обменять верхнюю и нижнюю части экрана по нажатию левой кнопки мыши
Нажатием левой кнопки мыши выбирать и запоминать цвет, при нажатии правой кнопки мыши - устанавливать выбранный цвет
Выводить координаты мышки по срабатыванию любой кнопки мышки каждый раз разными цветами

Вывод координат мыши на экран - Mikl___ хорошо прокомментировал, хороший вывод на экран
Вывод координат мыши в левом верхнем углу экрана - Charles Kludge предложил первый вывод координат без начального вызова обработчика из драйвера
Вывод на экран консоли номера строки и столбца, соответствующие положению курсора мыши непосредственно перед выводом - shilovec5377 для вывода координат в текстовом режиме замедлил курсор
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8646 / 4481 / 1669
Регистрация: 01.02.2015
Сообщений: 13,889
Записей в блоге: 11
26.07.2020, 16:09
При инициализации буфер всего экрана заполняется нулями. Потом, в пользовательском обработчике мыши просто обмениваются столбцы буфера и экрана, без проверки на необходимость восстановления или очистки.
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
;Заполнить 0-ю страницу видеопамяти произвольным текстом.
;Нажимая на левую кнопку мышки очистить нечетные колонки экрана,
;а при нажатии на правую кнопку - парные колонки экрана.
;При повторном нажатии на кнопку содержание соответствующей
;части экрана должно восстанавливаться.
 
.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, '$'
        ;условие вызова пользовательского обработчика прерывания
        MouseEvent                      equ     MouseEvent_PressLeftButton OR MouseEvent_PressRightButton
.data?
        ScreeBufferSize                 equ     80*25*2
        ScreenBuffer                    db      ScreeBufferSize dup (?)
.code
 
;Ожидание нажатия клавиши на клавиатуре
;вход
; - нет
;выход
;ax - al - ASCII код нажатой клавиши, ah - скан-код
ReadKey         macro
        mov     ah,     00h
        int     16h
endm
 
;Инициализация работы с "мышью"
;Выполняется аппаратный и программный сброс мыши и драйвера
;вход
; - нет
;выход
;ax - результат инициализации
;   - 0000h, если мышь или драйвер мыши не установлены
;   - FFFFh, если драйвер и мышь установлены
;bx - число кнопок
;   - 0002 или FFFF - две
;   - 0003 - три
;   - 0000 - другое количество
MouseInit       macro
        mov     ax,     0000h
        int     33h
endm
 
;Показать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseShowCursor macro
        mov     ax,     0001h
        int     33h
endm
 
;Спрятать курсор "мыши"
;вход
; - нет
;выход
; - нет
MouseHideCursor macro
        mov     ax,     0002h
        int     33h
endm
 
;Обработчик событий "мыши"
;вход
;АХ содержит условие вызова,
;ВХ - состояние кнопок,
;СХ, DX - X- и Y-координаты курсора,
;SI, DI - счетчики последнего перемещения по горизонтали и вертикали
;      (единицы измерения для этих счетчиков - мики, 1/200 дюйма),
;DS - сегмент данных драйвера мыши.
;выход
; - нет
MyMouseHandler  proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        push    es
        push    ds
 
        push    ax
        ;настройка сегментных регистров
        mov     ax,     0B800h
        mov     es,     ax
        mov     ax,     @data
        mov     ds,     ax
        xor     di,     di
        lea     si,     [ScreenBuffer]
        ;спрятать курсор мыши
        MouseHideCursor
        pop     ax
        ;если обработчик вызван по нажатию ЛКМ - сразу
        ;обменять содержимое буфера и экрана
@@IsLeftButton:
        test    ax,     MouseEvent_PressLeftButton
        jne     @@mmhAction
        ;если обработчик вызван по нажатию ПКМ - сместить указатели
        ;на буфер и на экран на одно знакоместо, а потом
        ;обменять содержимое буфера и экрана
@@IsRightButton:
        test    ax,     MouseEvent_PressRightButton
        je      @@mmhExit
        add     si,     2
        add     di,     2
        ;обмен содержимого буфера и экрана
@@mmhAction:
        mov     cx,     ScreeBufferSize/4
        @@mmhFor:
                push    [si]
                push    es:[di]
                pop     [si]
                pop     es:[di]
                add     si,     4
                add     di,     4
        loop    @@mmhFor
@@mmhExit:
        ;показать курсор
        MouseShowCursor
        pop     ds
        pop     es
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        retf
MyMouseHandler  endp
 
;Заполнение экрана символами
FillScreen      proc
        mov     ax,     0B800h
        mov     es,     ax
        xor     di,     di
        mov     bl,     0       ;символ
        mov     bh,     0       ;цвет
        mov     cx,     25*80   ;количество знакомест на экране
        mov     dl,     'A'     ;некоторое смещение, чтобы буквы были разными
        @@ForFill:
                and     bx,     0F0Fh
                mov     ax,     bx
                add     al,     dl
                add     ah,     3       ;цвет фона делаем отличным от цвета символа
                and     ah,     07h
                shl     ah,     1
                shl     ah,     1
                shl     ah,     1
                shl     ah,     1
                or      ah,     bh      ;к цвету фона добавляем цвет символа
                stosw                   ;записываем символ и его атрибут (цвета)
                                        ;переходим к следующему адресу символа на экране
                add     bx,     0101h   ;изменяем цвет и номер выводимого символа
                inc     dl
                cmp     dl,     'Z'-16
                jb      @@Skip
                mov     dl,     'A'
                @@Skip:
        loop    @@ForFill
        ret
FillScreen      endp
 
;основная программа
main            proc
        mov     ax,     @data
        mov     ds,     ax
        ;попытка инициализации мыши
        MouseInit
        cmp     ax,     MouseInitOk
        je      @@MouseInitOk
        ;если инициализация не удалась - вывести сообщение
        ;и завершить программу
        mov     ah,     09h
        lea     dx,     [msgMouseFault]
        int     21h
        jmp     @@Exit
 
@@MouseInitOk:
        ;заполнение экрана
        call    FillScreen
        ;очистить буфер экрана
        mov     ax,     ds
        mov     es,     ax
        lea     di,     [ScreenBuffer]
        mov     cx,     ScreeBufferSize/2
        xor     ax,     ax
        rep     stosw
        ;установить пользовательский обработчик событий "мыши"
        mov     ax,     seg MyMouseHandler      ;ES:DX = адрес обработчика
        mov     es,     ax
        mov     dx,     offset  MyMouseHandler
        mov     cx,     MouseEvent              ;CX = условие вызова
        mov     ax,     000Ch
        int     33h
        ;показать курсор
        MouseShowCursor
        ;цикл ожидания нажатия кнопки ESC
        ;в цикле проверяется работа обработчика мыши
        @@WaitEscapePressed:
                ReadKey
                cmp     al,     KeyCode_Esc
        jne     @@WaitEscapePressed
        ;завершение работы с "мышью"
        ; - спрятать курсор
        MouseHideCursor
        ; - удалить пользовательский обработчик прерывания
        mov     cx,     MouseEvent_None
        mov     ax,     000Ch
        int     33h
 
@@Exit:
        mov     ax,     4C00h
        int     21h
main            endp
 
end     main
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.07.2020, 16:09
Помогаю со студенческими работами здесь

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

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

Изменение разрешения экрана при нажатии на кнопку
При нажатии на кнопку должно быть разрешение на экран. как его сделать? <!DOCTYPE html> <html> <head> ...

При нажатии на кнопку показать блок в центре экрана
Ребят,как сделать что бы при нажатии на кнопку появлялся блок в центре экрана. <div class="row"> <div...

Как сделать кнопку очистить? Чтобы содержимое экрана отчистилось.
Есть js функция нахождения элементов от единицы до n. Можете подсказать как сделать кнопку очистить? чтобы содержимое экрана отчистилось...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru