Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
 
седьмой
35 / 34 / 1
Регистрация: 11.07.2012
Сообщений: 868
#1

Как написать самый простой драйвер клавиатуры? - Assembler

29.10.2016, 11:32. Просмотров 1595. Ответов 26
Метки нет (Все метки)

Хочу написать самый простой драйвер клавиатуры, по аппаратному прерыванию, что бы например при нажатии любой произвольной кнопки на экран выходили 3 символа 1,0 и пробел. При повторном нажатии кнопки снова это же самое и таким образом после нескольких нажатий кнопки на экране появились бы следующие символы 10 10 10 10 10 10 .... и тд... Больше компьютер не должен ничего делать просто тупо на каждое нажатие выдает 1,0 и пробел и все. Вот написал код, но он сперва сам выдает 1,0 пробел (без нажатия какой либо кнопки), затем реагирует только на одно нажатие клавиши и потом уже ни на чего не реагирует, в чем ошибка можете объяснить или исправить код?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.MODEL tiny
.386
.DATA
.CODE
org 100h
START:
STI ; разрешаю аппаратные прерывания
mov al,11111101b ;запрещаю все прерывания кроме прерываний от клавиатуры
out 21h,al
mov    ax,2509h           ; объявляю вектор прерывания клавиатуры для подмены адреса прерывания
mov    dx,010Dh          ; задаю адрес смещения для кода выполнения аппаратного прерывания
int 21h     ;заменяю вектор прерывания клавиатуры с системного на свой
    mov al,'0'     ; начало кода для выполнения по срабатыванию нажатой клавиши
        int 29h
    mov al,'1'
        int 29h
    mov al,' '
        int 29h    ; окончание кода по срабатыванию прерывания
    mov   al,20h     ; указание процессору что текущее нажатие кнопки обработано и нужный код по прерыванию выполнился
    out   20h,al     ; указание процессору, что бы он ждал следующее нажатие кнопки и запустил бы снова свой код (10 )          
END START

http://www.cyberforum.ru/cpp-beginners/thread2048150.html
0
Вложения
Тип файла: zip CLAV2.ZIP (144 байт, 5 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2016, 11:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как написать самый простой драйвер клавиатуры? (Assembler):

Написать клиент-сервер (самый простой)
Всем доброго времени суток ! Я поставил себе задачу написать клиент-сервер...

Написать самый простой мини-чат
Всем првиет! У меня есть задача: написать самый простой мини-чат! Я даже не...

DirectX - написать самый простой воксельный движок
Я снова всех приветствую! Возникла необходимость написать самый простой...

Самый самый самый простой пример рекурсии
приведите самый прост пример рекурсии)))void main(int k) { int n=10; k=n;...

Написать самый простой антивирусный сканер, который сможет найти вирус, записанный в автозагрузку
Всем привет, пишу практическую работу по информационной безопасности,...

26
Kukuxumushu
752 / 475 / 89
Регистрация: 13.06.2015
Сообщений: 1,629
Завершенные тесты: 2
31.10.2016, 16:35 #21
Цитата Сообщение от седьмой Посмотреть сообщение
Но ведь такой метки нет , на которую указывает ссылка безусловного перехода @b?
В FASM @b - это ближайшая предыдущая метка @@.
Цитата Сообщение от седьмой Посмотреть сообщение
Мне казалось что аппаратный драйвер это некая резидентная программа, которая постоянно находится в оперативной памяти компьютера, и которая при первом запуске подменяет вектор прерывания и код вызываемой программы постоянно находится в оперативной памяти. И по нажатию "нужной" кнопки процессор сразу обращается к этому коду? А так получается что процессор подвисает?
А что по-вашему процессор должен делать после того, как выполнил работу по подмене вектора? Тактирование едёт, инструкции должны выбираться из памяти и выполняться, а их там нет. Можно конечно проц в HLT загнать (и правильнее), но такой режим работает только на уровне железа (в винде не работает, поэтому не стал так делать).
Цитата Сообщение от седьмой Посмотреть сообщение
Чем fasm лучше Masm он не правильно компилирует код?
FASM как раз компилирует ровно то, что в него прописали. Инструкции 1 к 1 соответствуют машинным кодам. Отсутствует всякая двусмысленность между переменными и адресами, т.к. все переменные и метки для компилятора являются указателями.
1
седьмой
35 / 34 / 1
Регистрация: 11.07.2012
Сообщений: 868
31.10.2016, 22:48  [ТС] #22
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
такой режим работает только на уровне железа (в винде не работает, поэтому не стал так делать).
А мне не нужно в винде мне нужно в чистом досе, на уровне железа

Добавлено через 1 минуту
Можете сделать в ms-dos е?
0
Kukuxumushu
752 / 475 / 89
Регистрация: 13.06.2015
Сообщений: 1,629
Завершенные тесты: 2
31.10.2016, 22:54 #23
седьмой, вы бы для начала сформулировали задачу что вы хотите сделать? А то сначала вам надо только что-бы 10 выводилось, потом вам не понравилось, что проц зависает (хотя изначально никаких других задач вы сказали, что выполняться не будет), потом откуда-то появился фоновый режим, в котором висит резидентная программа... Ну вот значит висит она в фоне, а что в это время комп делать должен? И что должно делаться, когда управление перехватывает ваш драйвер? Что должно происходить, когда драйвер отработает?
1
седьмой
35 / 34 / 1
Регистрация: 11.07.2012
Сообщений: 868
01.11.2016, 06:57  [ТС] #24
Спасибо, задача как была так и осталась: Запускаю программу, которая является аппаратным драйвером нажатия любой одной кнопки и на экран выводится 10пробел, нажимаю еще раз выходит снова 10пробел, нажимаю 3й раз еще выходит 10пробел. Мне кажется именно так и должен работать стандартный рядовой драйвер аппаратный. В результате проверки кода, у меня этот аппаратный драйвер срабатывает только один раз и программа выходит в Дос (завершается). Точнее не так она сразу запускается и завершается, а потом отрабатывает только одно нажатие кнопки. А на последующие нажатия уже никак не реагирует. А то что, как Вы говорите я пишу и то и се и по разному, я наверно просто не совсем понятно для Вас формулирую наводящие вопросы, пытаясь понять почему программа работает так как работает, а не так как мне нужно. Нет задача прежняя ничено не изменилось...

Добавлено через 5 минут
И мне нужен код под чистый MS-DOS 6.22 (винда мне не нужна), у меня не эмулятор MS-DOS и не терминал, у меня на стареньком белом компе модели 80386 установлена старая добрая MS-DOS 6.22 c 3х 3х дюймовых дискет, NC, MASM, отладчик DEBUG, поставил еще дополнительно AFDPRO и отлаживаю ваш код под чистым досом.

Добавлено через 2 минуты
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
HLT загнать (и правильнее)
как туда загнать не подскажете?

Добавлено через 1 минуту
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
FASM как раз компилирует ровно то, что в него прописали.
Попробую поставить и сравнить, спасибо
0
Kukuxumushu
752 / 475 / 89
Регистрация: 13.06.2015
Сообщений: 1,629
Завершенные тесты: 2
01.11.2016, 07:51 #25
Цитата Сообщение от седьмой Посмотреть сообщение
задача как была так и осталась
Так это не драйвер тогда, а просто программа для работы с клавиатурой - она в монопольном режиме захватит все ресурсы компьютера и не даст ничему выполняться, кроме самой себя с околонулевой полезностью (хотя, возможно, вам это и надо).
А драйвер - это то что вы выше описывали - что-то грузится в память через config.sys, висит там и в фоновом режиме прозрачно для системы выполняет какую-то полезную работу, например, подменяет коды клавиш.
Цитата Сообщение от седьмой Посмотреть сообщение
как туда загнать не подскажете?
Заменить
Assembler
1
@@:jmp @b
на
Assembler
1
2
@@:hlt
jmp @b
Когда прерывание разбудит процессор и отработает, управление передастся на следующую инструкцию, которая снова его усыпит.
1
седьмой
35 / 34 / 1
Регистрация: 11.07.2012
Сообщений: 868
01.11.2016, 16:34  [ТС] #26
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
(хотя, возможно, вам это и надо).
да я не понимаю еще что мне надо, это просто задание которое нужно сделать, а драйверы никогда не писал, вот и тыкаюсь в разные строны.... пусть будет 2 варианта просто программа как вы говорите, которая держит все ресурсы и драйвер, что бы потом сравнить чем они отличаются на практике и какая у них разница в быстродействии реакции на клавишу

Добавлено через 1 минуту
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
А драйвер - это то что вы выше описывали - что-то грузится в память через config.sys
спасибо большое я попробую и потом отпишусь, что получилось

Добавлено через 8 часов 35 минут
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
Вот вам пожалуйста самое аппаратное-преаппаратное прерывание.
Kukuxumushu Спасибо огромное правда в fasm под виндой xp 32 отлично работает, интересно!
0
седьмой
35 / 34 / 1
Регистрация: 11.07.2012
Сообщений: 868
03.11.2016, 15:11  [ТС] #27
Спасибо всем за помощь, самый короткий код аппаратного драйвера клавиатуры получился вот такой для Masm
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
.MODEL tiny
.386
.DATA
.CODE
org 100h
START:
STI
mov al,11111101b
out 21h,al
mov    ax,2509h           
mov    dx,perem          
int 21h
m1:
jmp m1
perem:
push ax
in al,60h
mov ax,0E31h
    mov al,'0'
        int 29h
    mov al,'1'
        int 29h
    mov al,' '
        int 29h
    mov   al,20h
    out   20h,al          
pop ax
iret
END START
это код именно для моей задачи, мне не нужно восстановление регистров и старого прерывания (системного), полный код с восстановлением регистров есть в этой теме http://www.cyberforum.ru/asm-beginne...ml#post9717566 может быть имеет смысл эти темы объединить вместе, вот на всякий случай код
0
Вложения
Тип файла: zip DKKOR8.ZIP (316 байт, 0 просмотров)
03.11.2016, 15:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2016, 15:11
Привет! Вот еще темы с решениями:

Помогите написать драйвер клавиатуры!
1)Издающий писк только при вводе цифр на дополнительной клавиатуре 2)Издающий...

Самый-самый простой калькулятор на JS
6) Даны два вещественных положительных числа х и у. арифметические действия...

Как сделать самый простой рейтинг страницы 5 звёзд?Желательно с подсчётом
Если возможно без MySQL!)))

Зачем нужен драйвер и как написать простейший драйвер
Хотя в интернете и есть на русском языке некоторые обяснения что такое драйвер...


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

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

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