0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 9

модуль драйвера клавиатуры

07.01.2013, 19:08. Показов 4246. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разработать модуль драйвера клавиатуры, работающий в реальном режиме (под DOS), выполняющий в соответствии с вариантом следующие действия:
издающий щелчок при вводе латинской буквы после буквы кириллицы.
Кто может сделать, отпишитесь!
Вот листинг подобной программы:
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
486
.model flat, stdcall
; Модуль клавиатуры, стирающий экран консоли по нажатию клавиши "End"
;
 
; подключение файла определения констант, внешних вызовов и библиотек
include         const.inc
 
; сегмент данных
_DATA           SEGMENT
 
; принимает кол-во записанных символов
written     dd 0    
; хэндлер буфера ввода
inputH          dword ?
; хэндлер буфера вывода
outputH         dword ?
 
; текст заголовка консоли
con_title       db "Обработка клавиатуры",0
; резервные данные
c0              dword ? 
temp            dd ?
; пояснительный текст в консоли
str1            db "Для стирания экрана консоли - клавиша End",0 
; буфер кодов клавиш
keyboard_key    word 9 dup(0)   
; клавиша "ENTER"
key_ent1        db 00h              
; структура информации о консоли
; ее описание хранится в подключаемом файле windows.inc
; CONSOLE_SCREEN_BUFFER_INFO STRUCT
  ; dwSize                COORD <>
  ; dwCursorPosition      COORD <>
  ; wAttributes           WORD      ?
  ; srWindow              SMALL_RECT <>
  ; dwMaximumWindowSize   COORD <>
; CONSOLE_SCREEN_BUFFER_INFO ENDS
 
consoleInfo     CONSOLE_SCREEN_BUFFER_INFO <>
_DATA           ENDS
 
;сегмент кода
_TEXT           SEGMENT
 
start:
 
                ; освободить уже существующую консоль
                call FreeConsole@0
                ; создать консоль
                call AllocConsole@0
                ;получить хэндлер ввода
                push STD_INPUT_HANDLE
                call GetStdHandle@4
                mov inputH,eax
           
                ;получить хэндлер вывода
                push STD_OUTPUT_HANDLE
                call GetStdHandle@4
                mov outputH,eax
 
                ;задать заголовок окна консоли
                push offset con_title
                push offset con_title
                call CharToOemA@8
                push offset con_title
                call SetConsoleTitleA@4
                ;******************************
                ;перекодировка строки
                push offset str1
                push offset str1
                call CharToOemA@8
                ;вывести верхнюю строку 
                print offset str1,13,10
 
                ; обработка нажатий клавиш
loo:
                ; прочитать одну запись о событии
                push offset c0
                push 1
                push offset keyboard_key
                push inputH
                call ReadConsoleInputA@16
                ; нет ли события от клавиатуры?
                cmp word ptr keyboard_key,KEY_EV
                jne loo
                ; нажата или отпущена?
                cmp byte ptr keyboard_key+4,1
                jne loo
                ; вывести символ
                push 0
                push offset written
                push 1
                push offset byte ptr keyboard_key+14
                push outputH
                call WriteConsoleA@20
                ; ENTER
                cmp byte ptr keyboard_key+14,0Dh
                je ent
                ; клавиша ESC
                cmp byte ptr keyboard_key+14,27
                je exit_program
                ; клавиша End
                cmp byte ptr keyboard_key+12, 04fh
                je con_clean
                
                jmp loo
                
                ; очистка консоли
con_clean:                
                ; получаем информацию о консоли в структуру consoleInfo
                invoke GetConsoleScreenBufferInfo, outputH, ADDR consoleInfo
                ; обнуляем регистр eax
                mov eax,0
                ; извлекаем из структуры информацию о ширине и высоте текущей консоли
                mov ax, consoleInfo.dwSize.x
                mov cx, consoleInfo.dwSize.y
                ; перемножаем ширину и высоту консоли для получения общего числа ячеек, результат в регистре eax
                mul cx
                ; сохраняем регистр eax в стеке, так как он будет перезаписан вызовом следующей функции
                push eax
                ; заполняем консоль символом пробела с текущими атрибутами
                invoke FillConsoleOutputCharacter, outputH, ' ', eax, 0, offset temp
                ; восстанавливаем регистр eax с общим числом ячеек консоли
                pop eax
                ; обнуляем регистр ebx
                mov ebx,0
                ; извлекаем из структуры два байта атрибутов текущей консоли
                mov bx, consoleInfo.wAttributes
                ; меняем атрибуты ячеек консоли с хэндлером вывода outputH, с атрибутом ebx, кол-вом eax, начиная с 0,0
                invoke FillConsoleOutputAttribute, outputH, ebx, eax, 0, offset temp
                ; устанавливаем позицию курсора вывода в консоль обратно на левый верхний угол
                invoke SetConsoleCursorPosition, outputH, 0
                ; печатаем заново приглашение-подсказку
                print offset str1,13,10
                ; возвратиться к обработке клавиатурного ввода
                jmp loo
                ; обработка ENTER
ent:
                ; выводим управляющие символы LF(подача каретки) и CR(перевод строки)
                print offset key_ent1,10,13
                jmp loo
 
exit_program:
                ; закрыть консоль
                call FreeConsole@0
                ; завершить текущий процесс
                invoke ExitProcess, 0
_TEXT           ENDS
                end start
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.01.2013, 19:08
Ответы с готовыми решениями:

Модуль драйвера клавиатуры, cтирающий предыдущий символ при нажатии клавиш "win"
Курсовая работа, задание следующее: Разработать модуль драйвера клавиатуры, работающий в реальном режиме (под DOS), выполняющий в...

Перекомпиляция драйвера MIDI клавиатуры
Купил себе клавиатуру Miditech m61. А у меня windows 7 x64 Беда в том, что драйвер на неё только под 32х битную систему. Ставить 32х...

Слетели драйвера клавиатуры
На основании чего сделаны такие выводы и что было сделано: 1. При подключении этой же клавиатуры к другом компьютеру она прекрасно...

3
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
07.01.2013, 19:45
Ну я могу, только здесь разрыв шаблона. Приведенный код под винду (защищенный режим), а никак не реальный режим работы процессора.
1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
07.01.2013, 19:58
Цитата Сообщение от westcoust Посмотреть сообщение
(под DOS), <..>
издающий щелчок при вводе латинской буквы после буквы кириллицы.
А это как? При переключении раскладок? Да пожалуйста, только ко мне не приставайте - последний раз это творение я ковырял почти 20 лет назад.
Вложения
Тип файла: zip kb.zip (3.4 Кб, 51 просмотров)
1
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
09.01.2013, 23:55
Проверку символов русский/латинский можно оптимизировать. У меня получилось в таков виде, так и оставил, главное – принцип действия.
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
;DOS, TASM, COM-файл
;tasm.exe /m filename.asm
;tlink.exe /t /x filename.obj
;
.model tiny
.code
.386
ORG 100h
START:
;
    jmp Initial     ;на инициализацию резидента
 
TSR proc
pushf           ;выполнить
call dword ptr cs:INT_09;оригинальное прерывание
 
;сохранить регистры и флаги
pushf
push es
push ds
pusha
 
;установить ES для строковых операций
    push cs
    pop es
 
    push 40h    ;выходим на
    pop ds      ;буфер клавиатуры
 
    mov si,ds:[1Ch] ;получить адрес хвоста буфера
    mov al,ds:[si-2];получить в AL последный введенный символ
    cmp al,1Eh  ;мусор
    jz short exit
 
;проверка, символ является русской буквой или нет
    mov cx,(lenRus-Rus);длина строки с русскими символами
    lea di,Rus  ;адрес строки
    repne scasb ;сканировать строку
    jnz short m5    ;нет русской
 
    mov byte ptr cs:[flag],-1;есть русская, утановить флаг
    jmp short exit
m5:
;если установлен флаг, была русская буква
    cmp byte ptr cs:[flag],0;проверить флаг русской буквы
    jz short exit
 
;флаг установлен
;проверка, символ является латинской буквой или нет
    mov cx,(lenEn-En)
    lea di,En
    repne scasb
    jnz short exit  ;не латинская, выход
 
    call Click      ;щелчек и
    mov byte ptr cs:[flag],0;сбросить флаг
exit:
 
;востановить регистры и флаги
popa
pop ds
pop es
popf
    iret    ;выход из прерывания
;------------------------------
Click   proc
    cli
    mov al,10110110b
    mov dx,43h
    out dx,al
    mov ax,8E8h ;частота. Меньше - больше похоже на щелчек
    dec dx
    out dx,al
    mov al,ah
    out dx,al     
    add dx,1Fh
    in al,dx    ;включить динамик
    or al,0011b
    out dx,al
    sti
    mov cx,44h  ;длительность
a:
push cx
    mov cx,-1   ;задержка = 0FFFFh
a1:
    loop a1
pop cx
    loop a
    cli     
    in al,dx    ;выключить динамик
    and al,11111100b
    out dx,al
    sti
    ret
Click endp
;------Данные-------------
flag db 0
 
;русские символы
Rus db 80h,81h,82h,83h,84h,85h,86h,87h,88h,89h,8Ah,8Bh,8Ch,8Dh
    db 8Eh,8Fh,90h,91h,92h,93h,94h,95h,96h,97h,98h,99h,9Ah,9Bh
    db 9Ch,9Dh,9Eh,9Fh,0A0h,0A1h,0A2h,0A3h,0A4h,0A5h,0A6h,0A7h
    db 0A8h,0A9h,0AAh,0ABh,0ACh,0ADh,0AEh,0AFh,0E0h,0E1h,0E2h,0E3h
    db 0E4h,0E5h,0E6h,0E7h,0E8h,0E9h,0EAh,0EBh,0ECh,0EDh,0EEh,0EFh
lenRus:
 
En db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
   db 'abcdefghijklmnopqrstuvwxyz'
lenEn:
 
INT_09   dd  ?  ;адрес оригиналиного прерывания
;---------------------
TSR endp
;************
Initial:
 
;получить адрес прерывания и сохранить его адрес
    mov ax,3509h
    int 21h
    mov word ptr [Int_09],bx
    mov word ptr [Int_09+2],es
 
;установить наш обработчик
    mov ax,2509h
    lea dx,TSR  ;адрес нашего обработчика
    int 21h
 
;освободить память
    mov es,cs:[2ch] ;
    mov ah,49h  ;
    int 21h
 
    lea dx,Initial  ;конец резидента
    int 27h     ;Оставим часть программы в памяти.
 
end start
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.01.2013, 23:55
Помогаю со студенческими работами здесь

Модуль Wi-Fi не видит сети после его смены. Не могу установить драйвера
Поменяли модуль Wi-Fi, после этого нетбук ASUS 1005 PXD не видит сети и не работает Bluetooth. Установить драйвера тоже не получается -...

Как запретить автоматическую установку драйвера клавиатуры?
При подключении любой клавиатуры, виндус автоматом ставит драйвер Microsoft eHome - клавиатура MCIR. Как запретить автоматическую...

Asus F3s. Не работают драйвера тачпэда и клавиатуры
Здравствуйте! Пришел к Вам с такой проблемой. Стоит Windows 7 Ultimate x86. Был у меня антивирус Касперского 2013. Решил его удалить. Затем...

Вводимые с клавиатуры символы выводить на экран справа налево снизу вверх
Всем доброго времени суток! Помогите пожалуйста написать программу на языке С++ с использованием Ассемблера! Проблема в том что я не...

Вывести на экран текущее состояние клавиатуры в виде вертикальной таблицы
Доброго времени суток. Помогите пожалуйста написать программу на языке С++ с использованием Ассемблера. Есть трудности с языком,...


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

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

Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru