Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Cheerd
0 / 0 / 1
Регистрация: 17.11.2014
Сообщений: 30
1

Считывание и запись в буфер клавиатуры

29.11.2014, 10:41. Просмотров 1089. Ответов 7
Метки нет (Все метки)

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

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
; читаем из буфера информацию о  нажатой клавише
mov ax, 40h
mov es, ax                      ;начальный адрес сегмента 00400h
mov bx, es:[1ah]            ; в bx смещение (относительно es) ячейки, в которой
 ; записана  информация о клавише
mov ax, es:[bx]               ; теперь в ah – СКЭН, а в al – ASCII коды
 
cmp ah,48h ; нажатие стрелки вверх
jne mUp2
mov ah,50h
mov es:[bx],ax
jmp mCont
 
mUp2: ; отжатие стрелки вверх
cmp ah,48h+128
jne mDown
mov ah,50h+128
mov es:[bx],ax
jmp mCont
 
mDown: ; нажатие стрелки вниз
cmp ah,50h
jne mDown2
mov ah,48h
mov es:[bx],ax
jmp mCont
 
mDown2: ; отжатие стрелки вниз
cmp ah,50h+128
jne mLeft
mov ah,48h+128
mov es:[bx],ax
jmp mCont
 
mLeft: ; нажатие стрелки влево
cmp ah,4Bh
jne mLeft2
mov ah,4Dh
mov es:[bx],ax
jmp mCont
 
mLeft2: ; отжатие стрелки влево
cmp ah,4Bh+128
jne mRight
mov ah,4Dh+128
mov es:[bx],ax
jmp mCont
 
mRight: ; нажатие стрелки вправо
cmp ah,4Dh
jne mRight2
mov ah,4Bh
mov es:[bx],ax
jmp mCont
 
mRight2: ; отжатие стрелки вправо
cmp ah,4Dh+128
jne mCont
mov ah,4Bh+128
mov es:[bx],ax
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2014, 10:41
Ответы с готовыми решениями:

Ввод вещественного числа со знаком с клавиатуры в буфер
Привет всем! Подскажите, пожалуйста, каким образом ввести с клавиатуры...

Считывание символа с клавиатуры
Здравствуйте. Есть программа, в которой я считываю символ с клавиатуры с...

буфер клавиатуры / посимвольная запись и чтение / tasm
Здравствуйте, кто может помочь написать программу на assembler? Задача:...

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

Буфер клавиатуры
Как скопировать содержание буфера клавиатуры в буфер программы?

7
Cheerd
0 / 0 / 1
Регистрация: 17.11.2014
Сообщений: 30
10.12.2014, 11:34  [ТС] 2
Короче, я сделал, всё работает, вот так:
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
; считываем скэн код нажатой клавиши
in al, 60h
 
; записываем номер функции, которую будем вызывать в последствии
mov ah, 5
xor cx,cx
 
cmp al,48h ; нажатие стрелки вверх
jne mUp2
;jne mDown
mov ch,50h
int 16h
jmp exit
 
mUp2: ; отжатие стрелки вверх
cmp al,48h+128
jne mDown
mov ch,50h+128
int 16h
jmp exit
 
mDown: ; нажатие стрелки вниз
cmp al,50h
jne mDown2
;jne mLeft
mov ch,48h
int 16h
jmp exit
 
mDown2: ; отжатие стрелки вниз
cmp al,50h+128
jne mLeft
mov ch,48h+128
int 16h
jmp exit
 
mLeft: ; нажатие стрелки влево
cmp al,4Bh
jne mLeft2
;jne mRight
mov ch,4Dh
int 16h
jmp exit
 
mLeft2: ; отжатие стрелки влево
cmp al,4Bh+128
jne mRight
mov ch,4Dh+128
int 16h
jmp exit
 
mRight: ; нажатие стрелки вправо
cmp al,4Dh
jne mRight2
;jne exit1
mov ch,4Bh
int 16h
jmp exit
 
mRight2: ; отжатие стрелки вправо
cmp al,4Dh+128
jne exit1
mov ch,4Bh+128
int 16h
Тему удаляйте.
0
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
10.12.2014, 13:55 3
Цитата Сообщение от Cheerd Посмотреть сообщение
написать резидентную программу
И где здесь резидент?
Цитата Сообщение от Cheerd Посмотреть сообщение
Тему удаляйте.
Дык, только сделано криво. Можно найти массу железа на х86, где в 60 порту будет не 8041/8042/8255 data port, а что-нибудь совсем другое. Или для того, чтобы из порта 60h считать скан-код, надо сначала записать его индекс в некий индексный регистр. Читай Ральфа.
0
Cheerd
0 / 0 / 1
Регистрация: 17.11.2014
Сообщений: 30
10.12.2014, 14:52  [ТС] 4
Цитата Сообщение от Charles Kludge Посмотреть сообщение
И где здесь резидент?
Если тебе нужен весь код, то вот:
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
; Заголовок СОМ-программы
code segment 
assume cs:code,ds:code
org 100h
; Переход на загрузочную часть программы
f10: jmp start
;  Область  данных  резидентной  части.
key dw 5555h                        ;  ключ расположен в ячейке
;  со смещением 103h (100h байт
;  PSP и 3 байта jmp start)
soob db 'нажата Alt/t'
oldvect dd 0                           ;  здесь запоминаем адрес
;  системного обработчика   
 
;  Здесь начинается резидентная часть программы. Очень важным является
;  то, что когда мы попадаем сюда из фоновой программы, все сегментные
;  регистры, кроме CS, содержат данные фоновой программы. Поэтому там,
;  где используются команды, по умолчанию берущие базовый адрес из DS,
;  необходимо использовать префикс замены сегмента CS:.
newvect:
; Сохраняем в стеке все регистры, которые можем испортить
push ax
push bx
push cx
 
; считываем скэн код нажатой клавиши
in al, 60h
 
; записываем номер функции, которую будем вызывать в последствии
mov ah, 5
xor cx,cx
 
cmp al,48h ; нажатие стрелки вверх
jne mUp2
;jne mDown
mov ch,50h
int 16h
jmp exit
 
mUp2: ; отжатие стрелки вверх
cmp al,48h+128
jne mDown
mov ch,50h+128
int 16h
jmp exit
 
mDown: ; нажатие стрелки вниз
cmp al,50h
jne mDown2
;jne mLeft
mov ch,48h
int 16h
jmp exit
 
mDown2: ; отжатие стрелки вниз
cmp al,50h+128
jne mLeft
mov ch,48h+128
int 16h
jmp exit
 
mLeft: ; нажатие стрелки влево
cmp al,4Bh
jne mLeft2
;jne mRight
mov ch,4Dh
int 16h
jmp exit
 
mLeft2: ; отжатие стрелки влево
cmp al,4Bh+128
jne mRight
mov ch,4Dh+128
int 16h
jmp exit
 
mRight: ; нажатие стрелки вправо
cmp al,4Dh
jne mRight2
;jne exit1
mov ch,4Bh
int 16h
jmp exit
 
mRight2: ; отжатие стрелки вправо
cmp al,4Dh+128
jne exit1
mov ch,4Bh+128
int 16h
 
exit:
;  Восстанавливаем в регистрах информацию фоновой программы.
 
pop cx
pop bx
pop ax
 
;сообщить контроллеру прерываний, что обработка аппаратного прерывания закончилась
 mov al,20h
  out 20h,al
 
; Возвращаем управление фоновой программе.
 
iret
 
; Возвращаем управление стандартному обработчику
exit1:
 
pop cx
pop bx
pop ax
 
 
jmp cs:oldvect
 
 
;  Здесь кончается резидентная часть и начинается загрузочная часть программы.  
 
start:
;  Получаем вектор правильного (системного) обработчика (в ES:BX).
mov ah, 35h
mov al, 9
int 21h
;  Производим проверку (сравнивая с ключом) на повторную установку  программы.
 
cmp word ptr es:[103h], 5555h
jz inst
;  Запоминаем вектор правильного (системного) обработчика.
mov word ptr oldvect, bx
mov word ptr oldvect+2, es
;  Устанавливаем вектор своего обработчика.
mov dx, offset newvect
mov ah, 25h
mov al, 9
int 21h 
; Завершаем программу, оставляя резидентной в памяти ее часть,
; от начала PSP до метки start.
mov dx, offset start
int 27h
; Если программа уже установлена в памяти, выдаем сообщение об
; этом и завершаем программу, ничего не оставляя в памяти.
inst:  mov ah, 9
mov dx, offset soob2
int 21h
mov ah,4ch
int 21h
; Область данных  загрузочной части.
soob2 db 'nporpaMMa y}|{e ycTaHoBJIeHa$'
code ends
end f10
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Дык, только сделано криво. Можно найти массу железа на х86, где в 60 порту будет не 8041/8042/8255 data port, а что-нибудь совсем другое. Или для того, чтобы из порта 60h считать скан-код, надо сначала записать его индекс в некий индексный регистр. Читай Ральфа.
Как заработало, так и оставил.
0
Mikl___
Автор FAQ
13374 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,539
10.12.2014, 15:03 5
Цитата Сообщение от Cheerd Посмотреть сообщение
Как заработало, так и оставил.
Charles Kludge,
перед кем распинаешься? это же программисты коекакеры
0
Charles Kludge
Клюг
7646 / 3161 / 383
Регистрация: 03.05.2011
Сообщений: 8,382
10.12.2014, 15:15 6
Mikl___, просто хочу, чтобы у препода оказался ноут от NEC, Тотошки или Фуджика...
0
Mikl___
10.12.2014, 16:23
  #7

Не по теме:

Charles Kludge,
думаешь препод рискнет на СВОЁМ ноуте запускать поделия СВОИХ студентов?%-)

0
Cheerd
0 / 0 / 1
Регистрация: 17.11.2014
Сообщений: 30
10.12.2014, 17:42  [ТС] 8
Мы это в досбоксе запускаем.
0
10.12.2014, 17:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2014, 17:42

Существует ли буфер клавиатуры в Win
при старте досовой проги под вынью буфер клавиатуры очищается или в выни нет...

Поместить символ в буфер клавиатуры
Доброго времени суток всем! Взываю кого нибудь о помощи!!!Пишу сервер\клиент...

Возможно ли одновременно воспроизводить звуковой файл и читать буфер клавиатуры
Возможно ли одновременно воспроизводить звуковой файл и читать буфер...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru