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

Скан-коды нажатых клавиш записать в файл

19.12.2016, 20:39. Показов 3341. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем здравствуйте, пишу программу на тасм. условие такое нужно скан коды нажатых клавиш записать в файл, подскажите как сделать, скан коды нажатых клавиш выводит, как сделать что бы он их записывал в файл, заранее благодарю
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
sseg segment stack
db 128 dup(?)
sseg ends
 
dseg segment
text db 'Najmite klavishu',10,13,'$'
txt     db 10,13,'$'
hex   db '0123456789ABCDEF'
dseg ends
 
cseg segment
assume ss:sseg,ds:dseg,cs:cseg
start:
mov ax,dseg
mov ds,ax
 
mov ah,9
mov dx,offset text
int 21h
 
nachalo:
mov ah,0
int 22
cmp al,1bh
je konec
     push ax
mov dl,al
mov ah,6
int 21h
 
mov ah,6
mov dl,' '
int 21h
     pop ax
     push ax
shr al,4
mov ah,0
 
mov si,ax
mov dl,[si+hex]
mov ah,6
int 21h
     pop ax
     push ax
and al,00001111b
mov ah,0
mov si,ax
mov dl,[si+hex]
mov ah,6
int 21h
 
mov ah,6
mov dl,'h'
int 21h
 
mov ah,9
mov dx,offset txt
int 21h
jmp nachalo
 
konec:
mov ah,4ch
int 21h
cseg ends 
end start
вот программа которая выводит скан коды нажатых клавиш
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2016, 20:39
Ответы с готовыми решениями:

Что добавить в программу чтобы она показывала коды нажатых клавиш?
touchkeyboardactivity.cpp ///GNU GENERAL PUBLIC LICENSE Version 3 #include <sys/mman.h> #include <sys/stat.h> /* For...

МПС - определить скан-коды клавиш К11, К12, К14, К18 матричной клавиатуры 8х8
Как определить скан-коды клавиш К11, К12, К14, К18 матричной клавиатуры 8х8.

Отлов нажатых клавиш, и перенос их в файл
Вот код: procedure TForm1.Timer2Timer(Sender: TObject); var ini : TIniFile; begin ini := TiniFile.Create('C:\Log.ini'); ...

12
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
20.12.2016, 00:19
Цитата Сообщение от ВладимирС Посмотреть сообщение
как сделать что бы он их записывал в файл
Создай буфер в секции данных, и сбрасывай туда символы со-строки(51) твоего кода.
По окончании - обычная запись в файл через дос AH=40h
0
0 / 0 / 1
Регистрация: 18.12.2014
Сообщений: 64
22.12.2016, 12:23  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
Создай буфер в секции данных, и сбрасывай туда символы со-строки(51) твоего кода
а как именно это сделать, то то я не особо в этом разбираюсь, есть примеры, подскажите пожалуйста
0
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
22.12.2016, 15:43
Цитата Сообщение от ВладимирС Посмотреть сообщение
я не особо в этом разбираюсь
побори свою лень и разберись
0
0 / 0 / 1
Регистрация: 18.12.2014
Сообщений: 64
28.12.2016, 16:00  [ТС]
Цитата Сообщение от proc3nt Посмотреть сообщение
побори свою лень и разберись
подскажи, что я делаю не правильно
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
sseg segment stack
db 128 dup(?)
sseg ends
 
dseg segment
text db 'Najmite klavishu',10,13,'$'
txt     db 10,13,'$'
hex   db '0123456789ABCDEF'
file db'file.txt',0
buffer db 100 dup(?),'$'
dseg ends
 
cseg segment
assume ss:sseg,ds:dseg,cs:cseg
start:
mov ax,dseg
mov ds,ax
 
mov ah,3ch
    lea dx,file
    mov cx,0
    int 21h
 
mov ah,9
mov dx,offset text
int 21h
 
nachalo:
mov ah,0
int 22
cmp al,1bh
je konec
     push ax
mov dl,al
mov ah,6
int 21h
 
mov ah,6
mov dl,' '
int 21h
     pop ax
     push ax
shr al,4
mov ah,0
 
mov si,ax
mov dl,[si+hex]
mov ah,6
int 21h
     pop ax
     push ax
and al,00001111b
mov ah,0
mov si,ax
mov dl,[si+hex]
mov ah,6
int 21h
 
 
    mov buffer,dx
    mov ah,40h
    
    lea dx,txt
    int 21h
 
mov ah,6
mov dl,'h'
int 21h
 
mov ah,9
mov dx,offset txt
int 21h
jmp nachalo
 
konec:
mov ah,4ch
int 21h
 
 
cseg ends 
end start
Добавлено через 29 минут
фаил создает, с этим все хорошо, только почему то не хочет записывать в него

Добавлено через 16 часов 52 минуты
подскажите пожалуцста, где я ошибаюсь, очень срочно нужно
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
28.12.2016, 16:27
Цитата Сообщение от ВладимирС Посмотреть сообщение
нужно скан коды нажатых клавиш записать в файл
..ты уверен, что получаешь скан-коды, а не ascii ?
INT-16h кладёт скан в AH, а ты обрабатываешь AL.
Одним словом, глюков у тебя предостаточно.
0
0 / 0 / 1
Регистрация: 18.12.2014
Сообщений: 64
28.12.2016, 20:28  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
..ты уверен, что получаешь скан-коды, а не ascii ?
да это точно скан коды

Добавлено через 47 секунд
Цитата Сообщение от R71MT Посмотреть сообщение
Одним словом, глюков у тебя предостаточно.
блин ну лабно буду разбираться дальше
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
28.12.2016, 22:15
Цитата Сообщение от ВладимирС Посмотреть сообщение
да это точно скан коды
- это ASCII. Твой код на восьмёрку отвечает 38h.
INT-16h (у тебя 22) возвращает скан в AH. Заглянуть в отладчик не судьба чтоли?
На скрине я нажал 8, и получил в AL аски-код, а в AH - скан. Или тебе ASCII нужен?
Миниатюры
Скан-коды нажатых клавиш записать в файл  
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
29.12.2016, 22:32
Цитата Сообщение от ВладимирС Посмотреть сообщение
фаил создает, с этим все хорошо, только почему то не хочет записывать в него
После создания файла возвращается хэндл этого файла (в ax, если файл создан успешно, конечно), который используется для всех последующих операций, включая запись в файл - это раз. Здесь я не вижу, что он сохраняется/используется, т.к. после создания файла сразу пошло mov ah,9.
Далее, в любом спецификации написано, что при записи в файл помимо ah=40h, dx=адрес буфера нужно ещё задать bx=хэндл файла и cx=кол-во символов. Или ты считаешь, что на это не очень-то и важно, мало ли что написано? И что вот это за странная конструкция: mov buffer,dx? И почему lea dx,txt? Тебе нужно записывать в файл пустые строки?

Второе: после записи в файл его нужно закрыть. Это по-хорошему если.

Ну и третье: почему у тебя кол-во push'ей не соответствует кол-ву pop'ов? Конечно, здесь это не влияет на работоспособность, но это косяк.

p.s. Это жесть, конечно!
Assembler
1
2
mov ah,0
int 22
Напиши по-человечески int 16h
0
0 / 0 / 1
Регистрация: 18.12.2014
Сообщений: 64
15.01.2017, 18:01  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
Или тебе ASCII нужен?
в принципе пойдет и ASCII
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
15.01.2017, 21:28
ВладимирС, вы приведите полностью задание. А то буду нажимать на клавиши, их код будет сохраняться в файл (кстати в каком виде?), и программа никогда не завершиться.

Добавлено через 9 минут
У меня мысль. Я провожу неофициальное анкетирование студентов, которым некогда изучать ассемблер. Мне просто любопытно.
В обмен на программу, я прошу ответить на следующие вопросы
- название специальности
- причина отставания в изучении ассемблера
- почему не получаете помощи от сокурсников
- каким образом предполагаете получить зачёт, сдать экзамен (за оплату или преподу всё равно - он и так поставит, независимо от ваших знаний, тогда уточните - зачем вы здесь, если это не имеет значения)
- какова стоимость платного получения зачёта (я не верю, что вы сможете его получить самостоятельно)
- как изменится стоимость от выполнения или невыполнения данной работы

Добавлено через 1 час 40 минут
---------------------
Всё. Программу я написал.
Программа выводит на экран сообщение 'To exit the program press ESC.', после чего ASCII коды всех нажатых клавиш сохраняет в файл. Сохранение в файл производится не по-символьно, а через буфер, который по мере заполнения записывается на диск и опустошается для новой порции символов. После нажатия ESC цикл записи завершается, программа "сбрасывает" буфер на диск и завершает работу.
0
16.01.2017, 02:52

Не по теме:

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Я провожу неофициальное анкетирование студентов, которым некогда изучать ассемблер. Мне просто любопытно.
А мне ещё любопытно название ВУЗа с городом :) Если можно...

0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
16.01.2017, 08:27
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
.model small
 
.stack 100h
 
.data
 
        FileHandle      dw      ?               ;описатель (хэндл) файла
        FileName        db      'KeyLog.txt', 0 ;имя файла для записи кодов клавиш
        FileAttr        dw      00h             ;не ReadOnly, не Hidden,
                                                ; не System, не Archive, не VOLUME_ID
                                                ; не Directory
        ;сообщения программы
        msgPrompt       db      'To exit the program press ESC.', 13, 10, '$'
        ;сообщения об ошибках работы с файлом
        msgErrOpenFile  db      'Error open file', 13, 10, '$'
        msgErrWriteFile db      'Error write file', 13, 10, '$'
        msgErrCloseFile db      'Error close file', 13, 10, '$'
 
        EscAsciiCode    equ     1Bh     ;ASCII код клавиши Esc
 
        ;строка для преобразования числа в строку с 16-ричным представлением
        HexTable        db      '0123456789abcdef'
        ;формируемая строка, которая будет записана в файл
        AmountCodes     equ     16      ;количество кодов, которые будут записаны
                                        ;в каждую строку файла
        StringLen       dw      ?       ;текущая длина строки
        String          db      (AmountCodes*4+1) dup(?)        ;длина строки
                                        ;будет равна количеству кодов на строку
                                        ;умноженному на длину кода (сам код плюс
                                        ;разделитель, а в конце строки вместо разделителя
                                        ;два символа CR и LF)
        CountCode       dw      ?       ;текущее количество обработанных кодов в строке
 
.code
 
;добавляет (дописывает) символ в строку
;вход:
;al - символ для записи
;String, StringLen - глобальные переменные
WriteCharToString       proc
        push    ax
        push    si
        mov     si,     StringLen
        mov     String[si],     al
        inc     word ptr StringLen
        pop     si
        pop     ax
        ret
WriteCharToString       endp
 
;преобразование байта в строку шестнадцатеричного
;представления числа
;вход:
;al    - число для преобразования
;выход
;String, StringLen - в конце строки добавляется строка вида '00h'
HexToStr        proc
        push    ax
        push    bx
        push    cx
        push    dx
 
        mov     bx,     OFFSET HexTable
 
        mov     dx,     ax
 
        and     ax,     00f0h
        mov     cl,     4
        shr     ax,     cl
        xlat
        call    WriteCharToString
 
        mov     ax, dx
 
        and     ax, 000fh
        xlat
        call    WriteCharToString
 
        mov     al,     'h'
        call    WriteCharToString
 
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
HexToStr        endp
 
;запись строки в файл
;вход:
;String, StringLen - глобальные переменные (строка)
;FileHandle - хэндл файла
;выход:
;CY - если установлен, то была ошибка
WriteStringToFile       proc
        push    ax
        push    bx
        push    cx
        push    dx
 
        mov     ah,     40h
        mov     bx,     FileHandle
        lea     dx,     String
        mov     cx,     StringLen
        int     21h
 
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
WriteStringToFile       endp
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;сообщение о начале работы программы
        mov     ah,     09h
        lea     dx,     msgPrompt
        int     21h
 
        ;инициализация переменных
        ;строка - пустая, кодов в строке - нет
        mov     ax,     0
        mov     StringLen,      ax
        mov     CountCode,      ax
 
        ;открываем файл для записи
        mov     ah,     3Ch
        mov     cx,     FileAttr
        lea     dx,     FileName
        int     21h
        mov     FileHandle,     ax
        ;если ошибок нет, то перейти к записи кодов в файл
        jnc     @@SaveAllKeyCode
        ;если была ошибка открытия файла,
        ; то вывести сообщение и завершить программу
        mov     ah,     09h
        lea     dx,     msgErrOpenFile
        int     21h
        jmp     @@Exit
 
@@SaveAllKeyCode:
 
        ;читаем один символ с клавиатуры (с ожиданием)
        mov     ah,     00h
        int     16h
 
        ;если нажата клавиша Esc, то завершить цикл
        cmp     al,     EscAsciiCode
        jz      @@FlushFile
 
        ;увеличить переменную, подсчитывающую количество кодов в строке
        inc     word ptr CountCode
        ;если это не первая строка, то поставить разделитель - пробел
        cmp     word ptr CountCode,     1
        je      @@SkipDelimiter
        mov     bx,     ax
        mov     al,     ' '
        call    WriteCharToString
        mov     ax,     bx
@@SkipDelimiter:
        ;добавить к строке код клавиши в hex формате
        call    HexToStr
        ;если это последний код для строки - добавить в конец перевод строки
        ;и записать в файл (в буфер файла)
        cmp     word ptr CountCode,     AmountCodes
        jb      @@SkipWriteToFile
        mov     al,     13
        call    WriteCharToString
        mov     al,     10
        call    WriteCharToString
        call    WriteStringToFile
        mov     word ptr StringLen,     0
        mov     word ptr CountCode,     0
        ;если была ошибка записи в файл,
        ; то вывести сообщение и завершить программу
        jnc     @@SkipWriteToFile
        mov     ah,     09h
        lea     dx,     msgErrWriteFile
        int     21h
        jmp     @@CloseFile
 
@@SkipWriteToFile:
        jmp     @@SaveAllKeyCode
 
@@FlushFile:
        ;дозапись остатков буфера в файл
        call    WriteStringToFile
        mov     word ptr StringLen,     0
        ;если была ошибка записи в файл,
        ; то вывести сообщение и завершить программу
        jnc     @@CloseFile
        mov     ah,     09h
        lea     dx,     msgErrWriteFile
        int     21h
        jmp     @@CloseFile
 
@@CloseFile:
        ;закрытие файла
        mov     ah,     3Eh
        mov     bx,     FileHandle
        int     21h
        ;если ошибок нет, то перейти к завершению программы
        jnc     @@Exit
        ;если была ошибка закрытия файла,
        ; то вывести сообщение и завершить программу
        mov     ah,     09h
        lea     dx,     msgErrCloseFile
        int     21h
 
@@Exit:
        mov     ax,     4C00h
        int     21h
main    endp
end     main
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.01.2017, 08:27
Помогаю со студенческими работами здесь

Checkbox: записать в массив последовательность нажатых и не нажатых галок
Добрый вечер не буду мусолить и перейду сразу к вопросу с вашего позволения. Собственно вопрос в заголовке, каким образом можно записать...

скан-коды клавиатуры
Как определить скан-код нажатой клавиши? private void Form1_KeyPress(object sender, KeyPressEventArgs e) { //определяем...

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

Распознование нажатых клавиш
Всем добрый день. Народ, мне через 2 дня сдавать экзамен, а я практически по delphi ничего не знаю. Не подскажите где могу прочитать темы:...

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru