Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 0
Регистрация: 29.12.2013
Сообщений: 81
1

Создать драйвер клавиатуры, который будет заменять пробел на ъ

16.04.2016, 20:21. Показов 1696. Ответов 8
Метки нет (Все метки)

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
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
.386 ;процессор
.model flat, stdcall ;плоская модель
option casemap :none 
 
KEY_EV equ 1h
; прототипы внешних процедур
EXTERN GetStdHandle@4:NEAR
EXTERN WriteConsoleA@20:NEAR
EXTERN SetConsoleCursorPosition@8:NEAR
EXTERN SetConsoleTitleA@4:NEAR
EXTERN FreeConsole@0:NEAR
EXTERN AllocConsole@0:NEAR
EXTERN CharToOemA@8:NEAR
EXTERN SetConsoleCursorPosition@8:NEAR
EXTERN SetConsoleTextAttribute@8:NEAR
EXTERN ReadConsoleA@20:NEAR
EXTERN SetConsoleScreenBufferSize@8:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN ReadConsoleInputA@16:NEAR
 
; директивы компоновщику для подключения библиотек
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
include c:\masm32\include\windows.inc;содержит описание типов данных Windows 
 
;сегмент данных
_DATA SEGMENT
writed      dd 0    ;принимает кол-во записанных символов
space   db  32  ;space
zamena  db  234; zamena na ъ
    InputH DWORD ?
    OutputH DWORD ?
    TITL DB "Обработка клавиатуры",0
    CO DWORD;Резерв
    STR1 DB "Программа при вводе заменяет space ",0 
    KEYBOARD_KEY WORD 9 dup(?)  ;Коды клавиш
    KEY_ENT1 db 00h             ;Клавиша ENTER
 
_DATA ENDS
 
 
;сегмент кода
_TEXT SEGMENT
START:
;образовать консоль
;вначале освободить уже существующую
CALL FreeConsole@0
CALL AllocConsole@0
 
;получить InputH ввода
PUSH STD_INPUT_HANDLE
CALL GetStdHandle@4
MOV InputH,EAX
;получить OutputH ввода
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle@4
MOV OutputH,EAX
 
;задать заголовок окна консоли
PUSH OFFSET TITL
PUSH OFFSET TITL
CALL CharToOemA@8
PUSH OFFSET TITL
CALL SetConsoleTitleA@4
;******************************
;перекодировка строки
PUSH OFFSET STR1
PUSH OFFSET STR1
CALL CharToOemA@8
;вывести верхнюю строку 
;**********************************************
CALL INPUTEVENT
;******************************
;Функция обработки нажатия клавиш
INPUTEVENT PROC
 
LOO:
    ;прочитать одну запись о событии
    PUSH OFFSET CO
    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 writed
    PUSH 1
    PUSH OFFSET BYTE PTR KEYBOARD_KEY+14
    PUSH OutputH
    CALL WriteConsoleA@20
 
;замена на ъ
 
    CMP BYTE PTR KEYBOARD_KEY, 32
        je SPACE
 
 
 
SPACE: 
    PUSH 0
    PUSH offset writed
    PUSH 1
    PUSH OFFSET zamena
    PUSH OutputH
    CALL WriteConsoleA@20
 
 
jmp LOO
 
INPUTEVENT ENDP
 
;закрыть консоль
EXIT:
CALL FreeConsole@0
PUSH 0
CALL ExitProcess@4
RET
_TEXT ENDS
END START
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2016, 20:21
Ответы с готовыми решениями:

Как создать такой скрипт, который будет заменять все вхождения в тексте?
Всем доброго времени суток. Как сделать такой скрипт (например, на Python)? Есть такой текст: ...

Нужен шифратор/дешифратор, который будет заменять буквы в тексте
Мне нужен год по которому программа будет заменять буквы в тексте. Например А на Б, Г на З и т.д. ...

Если в pascal тип данных, который будет заменять string и integer сразу?
Если в pascal тип данных,который, будет заменять string и integer сразу?

создать матрицу которая будет заменять элементы четных строк на цифры от 0 до 9
создать матрицу которая будет заменять элементы четных строк на цифры от 0 до 9.

8
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
17.04.2016, 08:52 2
Trombovoz, у тебя в строках 103-108 управление всегда передаётся на метку SPACE:
0
2 / 2 / 0
Регистрация: 29.12.2013
Сообщений: 81
17.04.2016, 23:10  [ТС] 3
Цитата Сообщение от R71MT Посмотреть сообщение
Trombovoz, у тебя в строках 103-108 управление всегда передаётся на метку SPACE:
Вот, немного изменил код. Теперь при нажатии клавиши "ъ", у меня выводится "ъ " (с пробелом). А как убрать букву, чтобы остался пробел один?
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
LOO:
    ;прочитать одну запись о событии
    PUSH OFFSET CO
    PUSH 1
    PUSH OFFSET KEYBOARD_KEY
    PUSH InputH
    CALL ReadConsoleInputA@16
 
    ;нет ли события от клавиатуры?
    CMP BYTE PTR KEYBOARD_KEY,KEY_EV
    JNE LOO
 
    ;Нажата или отпущена?
    CMP BYTE PTR KEYBOARD_KEY+4,1
    JNE LOO
 
    PUSH 0
    PUSH offset writed
    PUSH 1
    PUSH OFFSET BYTE PTR KEYBOARD_KEY+14
    PUSH OutputH
    CALL WriteConsoleA@20
 
    CMP BYTE PTR KEYBOARD_KEY+14,234
    JNE LOO 
 
    ;замена пробела на "space" 
    PUSH 1
    PUSH OFFSET space
    PUSH OutputH
    CALL WriteConsoleA@20
    
 
jmp LOO
0
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
18.04.2016, 09:06 4
Trombovoz, попробуй выловить глюк в отладчике
0
2 / 2 / 0
Регистрация: 29.12.2013
Сообщений: 81
20.04.2016, 21:08  [ТС] 5
Цитата Сообщение от R71MT Посмотреть сообщение
попробуй выловить глюк в отладчике
А можно по подробней? Как это сделать?
0
6 / 6 / 1
Регистрация: 24.06.2014
Сообщений: 129
10.04.2017, 23:43 6
А при каких обстоятельствах программа закрывается? И такой вопрос, я правильно понял как она работает: она запускается, затем, после нажатия любой клавиши в любом окне, она выводит в консоль букву 'ъ'????
0
2 / 2 / 0
Регистрация: 29.12.2013
Сообщений: 81
11.04.2017, 00:42  [ТС] 7
Цитата Сообщение от Vadiliy Посмотреть сообщение
А при каких обстоятельствах программа закрывается? И такой вопрос, я правильно понял как она работает: она запускается, затем, после нажатия любой клавиши в любом окне, она выводит в консоль букву 'ъ'????
При запуске программы открывается консоль, в ней пишешь любые слова через пробел, последний в свою очередь заменяется на ъ. Пример: приветъкакъдела.
0
Asm/C++/Delphi/Py/PHP/VBA
6751 / 1996 / 232
Регистрация: 14.12.2014
Сообщений: 4,194
Записей в блоге: 12
11.04.2017, 09:30 8
Цитата Сообщение от Trombovoz Посмотреть сообщение
Нужно создать драйвер клавиатуры, который будет заменять пробел на ъ
Цитата Сообщение от Trombovoz Посмотреть сообщение
Теперь при нажатии клавиши "ъ", у меня выводится "ъ " (с пробелом). А как убрать букву, чтобы остался пробел один?
Так я не понял, надо пробел на "ъ" заменять или наоборот?
Цитата Сообщение от Trombovoz Посмотреть сообщение
замена пробела на "space"


Ну естественно будет выводиться и "ъ", и пробел. Ты же сначала выводишь, а затем проверяешь и выводишь снова, если введён "ъ".

И ещё код процедуры INPUTEVENT вынеси за пределы основной процедуры (основного кода), иначе после её завершения (правда, здесь завершения нет, но всё же) управление вернётся опять к ней же...

Добавлено через 4 минуты
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
.386 ;процессор
.model flat, stdcall ;плоская модель
option casemap :none 
 
KEY_EV equ 1h
; прототипы внешних процедур
EXTERN GetStdHandle@4:NEAR
EXTERN WriteConsoleA@20:NEAR
EXTERN SetConsoleCursorPosition@8:NEAR
EXTERN SetConsoleTitleA@4:NEAR
EXTERN FreeConsole@0:NEAR
EXTERN AllocConsole@0:NEAR
EXTERN CharToOemA@8:NEAR
EXTERN SetConsoleCursorPosition@8:NEAR
EXTERN SetConsoleTextAttribute@8:NEAR
EXTERN ReadConsoleA@20:NEAR
EXTERN SetConsoleScreenBufferSize@8:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN ReadConsoleInputA@16:NEAR
 
; директивы компоновщику для подключения библиотек
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
include \masm32\include\windows.inc;содержит описание типов данных Windows 
 
;сегмент данных
_DATA SEGMENT
writed      dd 0    ;принимает кол-во записанных символов
space   db  32  ;space
zamena  db  234; zamena na ъ
    InputH DWORD ?
    OutputH DWORD ?
    TITL DB "Обработка клавиатуры",0
    CO DWORD ?  ;Резерв
    STR1 DB "Программа при вводе заменяет space ",0 
    KEYBOARD_KEY WORD 9 dup(?)  ;Коды клавиш
    KEY_ENT1 db 00h             ;Клавиша ENTER
 
_DATA ENDS
 
 
;сегмент кода
_TEXT SEGMENT
START:
;образовать консоль
;вначале освободить уже существующую
CALL FreeConsole@0
CALL AllocConsole@0
 
;получить InputH ввода
PUSH STD_INPUT_HANDLE
CALL GetStdHandle@4
MOV InputH,EAX
;получить OutputH ввода
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle@4
MOV OutputH,EAX
 
;задать заголовок окна консоли
PUSH OFFSET TITL
PUSH OFFSET TITL
CALL CharToOemA@8
PUSH OFFSET TITL
CALL SetConsoleTitleA@4
;******************************
;перекодировка строки
PUSH OFFSET STR1
PUSH OFFSET STR1
CALL CharToOemA@8
;вывести верхнюю строку 
;**********************************************
CALL INPUTEVENT
;******************************
 ;закрыть консоль
EXIT:
CALL FreeConsole@0
PUSH 0
CALL ExitProcess@4
 
 
;Функция обработки нажатия клавиш
INPUTEVENT PROC
 
LOO:
    ;прочитать одну запись о событии
    PUSH OFFSET CO
    PUSH 1
    PUSH OFFSET KEYBOARD_KEY
    PUSH InputH
    CALL ReadConsoleInputA@16
 
    ;нет ли события от клавиатуры?
    CMP BYTE PTR KEYBOARD_KEY,KEY_EV
    JNE LOO
 
    ;Нажата или отпущена?
    CMP BYTE PTR KEYBOARD_KEY+4,1
    JNE LOO
 
    PUSH 0
    PUSH offset writed
    PUSH 1
 
    CMP BYTE PTR KEYBOARD_KEY+14,234
    JE SPACE
    PUSH OFFSET BYTE PTR KEYBOARD_KEY+14
    JMP NOSPACE
SPACE:
    ;замена "ъ" на пробел
    PUSH OFFSET space
NOSPACE:
 
    PUSH OutputH
    CALL WriteConsoleA@20
 
jmp LOO
 
INPUTEVENT ENDP
 
_TEXT ENDS
END START
Добавлено через 23 минуты
Зачем, кстати, создавать новую консоль? Почему нельзя скомпилить прогу как консольную и использовать стандартную консоль?
0
6 / 6 / 1
Регистрация: 24.06.2014
Сообщений: 129
12.04.2017, 00:42 9
Автор, вы не могли бы прикрепить скриншот работы данной программы? мне на днях курсач сдавать и скрин очень, прям очень помог бы.
0
12.04.2017, 00:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2017, 00:42
Помогаю со студенческими работами здесь

создать проект, который из цифр вводимого с клавиатуры будет считать количество цифр, которые принадлежат [15
Помогите !!! Создать проект, который из цифр вводимого с клавиатуры будет считать количество цифр,...

Создать файл, в который будет вводится текст который введен с Edit
помогите пожалуйста с делфи. нужно создать файл в который будет вводится текст который введен с...

Как заменять текст на пробел???
$string = $cont; $patterns = "<div>"; $patterns = "</div>"; $patterns =...

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


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

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