Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/40: Рейтинг темы: голосов - 40, средняя оценка - 4.63
45 / 44 / 1
Регистрация: 11.07.2012
Сообщений: 1,024
1

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

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

Author24 — интернет-сервис помощи студентам
Хочу написать самый простой драйвер клавиатуры, по аппаратному прерыванию, что бы например при нажатии любой произвольной кнопки на экран выходили 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
Вложения
Тип файла: zip CLAV2.ZIP (144 байт, 17 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2016, 11:32
Ответы с готовыми решениями:

Как в visual studio 15 написать самый простой код на LUA
Хочу написать самый простой код на LUA в VS. Для этого взял готовый пример из книжки, в одну...

Захотел написать самый простой калькулятор
Решил написать самый простой калькулятор, все вроде и работает, но проблемы с делением, можете...

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

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

26
45 / 44 / 1
Регистрация: 11.07.2012
Сообщений: 1,024
29.10.2016, 12:58  [ТС] 2
Мне не нужно возвращать старый системный адрес драйвера клавиатуры, на этом компе я постоянно буду нажимать одну единственную кнопку (любую) и ждать от нее на экране 3 символа 1,0, пробел, и выключать компьютер этот никогда не буду, эта программа с прерыванием на нем будет всегда (но не эта именно, эта не работает как надо, а исправленная)

Добавлено через 21 минуту
Сама по себе задача бессмысленная, оно и понятно, я сам для себя ее создал и пытаюсь сделать, с одной единственной целью - убедиться, что код с аппаратным прерыванием рабочий, а не просто код ради кода.

Добавлено через 3 минуты
В другой теме уважаемы мастера ассемблера давали код для аппаратного прерывания сом порта, с подменой вектора прерывания 0Сh , но его не получилось проверить на практике, и я даже не понял как его проверить? Поэтому и решил поставить себе самую простую задачу на нажатию одной клавиши клавиатуры.
0
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
29.10.2016, 22:23 3
Цитата Сообщение от седьмой Посмотреть сообщение
Хочу написать самый простой драйвер клавиатуры,
хорошая мысль .
Все кто не дурики знают что делалать с клаваой. Когда мы ещё не родились, люди уже хотели обманывать
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
30.10.2016, 01:31 4
Цитата Сообщение от седьмой Посмотреть сообщение
Сама по себе задача бессмысленная, оно и понятно, я сам для себя ее создал и пытаюсь сделать, с одной единственной целью - убедиться, что код с аппаратным прерыванием рабочий, а не просто код ради кода.
Добавлено через 3 минуты
В другой теме уважаемы мастера ассемблера давали код для аппаратного прерывания сом порта, с подменой вектора прерывания 0Сh , но его не получилось проверить на практике, и я даже не понял как его проверить? Поэтому и решил поставить себе самую простую задачу на нажатию одной клавиши клавиатуры.
Вот вам пожалуйста самое аппаратное-преаппаратное прерывание.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
; FASM
org 100h
xor ax,ax             ; 0 -> DS
mov ds,ax
mov word [36],KeyInt  ; подмена вектора прерывания
mov [38],cs
@@:jmp @b    ; бесконечный цикл простоя
 
KeyInt:      ; собственно наш драйвер
push ax      ; сохраняем состояние
mov ax,0e31h ; выводим 1
int 10h
dec al       ; выводим 0
int 10h
mov al,' '   ; выводим пробел
int 10h
mov al,20h   ; сигнал контроллеру
out 20h,al   ; что прерывание окончено
pop ax       ; восстанавливаем состояние
iret
Срабатывает, разумеется 2 раза - при нажатии и при отпускании клавиши, как и задумано аппаратным прерывальщиком.
И переходите уже на FASM, а то долго мучиться будете.

Добавлено через 11 минут
Или вот через DOS ещё веселее.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
org 100h
mov ax,2509h  ; подмена вектора прерывания
mov dx,KeyInt
int 21h
mov dx,msg    ; подготовка к выводу строки
mov ah,9
@@:jmp @b     ; бесконечный цикл простоя
msg db '10 $' ; строка
 
KeyInt:       ; собственно наш драйвер
int 21h
mov al,20h    ; сигнал контроллеру
out 20h,al    ; что прерывание окончено
iret
А у вас я смотрю iret отсутствует и в простой программа не входит, поэтому и не работает ничего, да и адрес компилятор сам бы вычислять должен.
2
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
30.10.2016, 03:29 5
Kukuxumushu, а хде оут 64?
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
30.10.2016, 03:47 6
Цитата Сообщение от R71MT Посмотреть сообщение
а хде оут 64?
Моргание выключателем чтоль?
Assembler
1
2
3
4
5
6
in al,61h
push ax
or al,80h
out 61h,al
pop ax
out 61h,al
Я так и не смог нигде найти внятного описания зачем это нужно, тем более без него всё прекрасно работает.
1
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
30.10.2016, 04:02 7
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
out 61h,al
...кто опохмеляется, кто кросс бежит с утра
..кому чего здесь нравится, весёлая Москва

Добавлено через 1 минуту
...нашёл куда отправить...
Чипсет тебя не поймёт

Добавлено через 2 минуты
Kukuxumushu, лучше скажи, как прочитать SMBus
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
30.10.2016, 04:09 8
Цитата Сообщение от R71MT Посмотреть сообщение
лучше скажи, как прочитать SMBus
Чем?
0
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
30.10.2016, 04:28 9
ручками...
Где этот бус вообще находится? Через пси его искать чтоли?
Сейчас явно я не собираюсь этим заниматься, но чисто для интереса хотелось-бы узнать..
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
30.10.2016, 04:58 10
R71MT, так эт самое, вот у него и окошечко памяти есть, и порты, и даже IRQ на нём висит. Осталось только мануал на это всё хозяйство найти.
Миниатюры
Как написать самый простой драйвер клавиатуры?  
0
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
30.10.2016, 05:26 11
Kukuxumushu, а читать её ты в курсе как? Протокол там не подарок... Дай запрос... и жди...
0
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
30.10.2016, 05:48 12
R71MT, понятия не имею)
0
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
30.10.2016, 05:54 13
Седьмой, твоё нажатие клавиши, не даёт спокойно жить APIC. Перехвати его, чтоб клава вообще ни на что не реагировала. Поставь терминал, и чтоб он тебе выдавал по-каждоому нажатию клавиши по штуке баксов.
Клава самый основной ингредиент компа. IRQ1 о многом говорит
0
45 / 44 / 1
Регистрация: 11.07.2012
Сообщений: 1,024
30.10.2016, 06:09  [ТС] 14
Цитата Сообщение от R71MT Посмотреть сообщение
Все кто не дурики знают что делалать с клаваой.
Не понял, что Вы имели в виду, вы мне уже здорово помогли в разных темах по ассемблеру, с моими тупыми вопросами, но вот этот ответ я не понял. Я себя не считаю Д. хотя смотря как на это посмотреть (это вопрос философский и к теме форума не относится), но что делать с Клавой в данном случае не знаю. И зачем Вы к Кукухимусу придираетесь? человек первый откликнулся на вопрос темы, совершил поступок достойный уважения неуча в ассемблере, а Вы его пытаетесь упрекнуть в неверности кода, хотя осталось только проверить рабочий этот код или нет и все станет ясно.

Добавлено через 11 минут
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
А у вас я смотрю iret отсутствует
эта команда как я понял, как раз наоборот отключает драйвер и выводит код в дос
Assembler
1
Команда IRET сначала извлекает новое значение регистра EIP (IP) из стека, а затем значение сегментного регистра CS. После этого еще извлекается значение регистра флагов. После извлечения данных значения записываются в соответствующие регистры и таким образом происходит переход управления на адрес, который поместила в стек команда INT или сам процессор перед вызовом обработчика прерывания. Команда IRET применяется как при возврате из обработчиков программных прерываний, так и аппаратных.
А для того что бы этот аппаратный драйвер оставался в оперативной памяти, в режиме ожидания нажатия клавиши, эта команда как раз не нужна?
0
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
30.10.2016, 06:14 15
седьмой, не грузись... Ни чего личного.
1
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
30.10.2016, 06:17 16
Цитата Сообщение от седьмой Посмотреть сообщение
А для того что бы этот аппаратный драйвер оставался в оперативной памяти, в режиме ожидания нажатия клавиши, эта команда как раз не нужна?
Ваша проблема в том, что вы свои задачи формулируете очень издалека и маленькими кусочками, поэтому вам тут все уже замучились отвечать. Что вы представляете под "драйвером"? Вот у вас DOS работает, и вам какой-то хоткей нужен, по которому всплывает ваша прога, что-то делает, передаёт управление обратно в DOS? Это делает так. А если только ваша программа в монопольном режиме запущена - ничего выдумывать не надо, просто дописывайте код в обработчик, который выше сделали.
1
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
30.10.2016, 06:19 17
После перезагрузки нет никаких драйверов... Драйвер - это ты! Возьми управление и всё. Если не даш доське загрузится, то ты хозяит. Кроме аппаратных вещей можешь управлять системой по-своему желанию.
1
45 / 44 / 1
Регистрация: 11.07.2012
Сообщений: 1,024
30.10.2016, 08:10  [ТС] 18
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
что вы свои задачи формулируете очень издалека
я уже не формулирую задачи просто для себя разбираюсь, пытаюсь понять как работает ассемблер, вдруг еще пригодится... тут же студенты наверно в основном обращаются, они на лету схватывают и сдают преподам, а мне просто интересно разобраться как это все работает, может зря вас от дел отвлекаю... ну не отвечайте , мне на этом форуме и так очень много мне помогли, может быть кто нибудь другой ответит, у кого есть время и желание...
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
ничего выдумывать не надо, просто дописывайте код в обработчик,
хорошо так и делаю... спасибо.

Добавлено через 10 минут
Цитата Сообщение от R71MT Посмотреть сообщение
После перезагрузки нет никаких драйверов
перезагрузки чего? Если операционной системы, то понятно что драйверов нет, ну или есть те которые резидентно загружаются вместе с операционной системой. То что моего драйвера нет это понятно. Но мне то нужно что бы запустив драйвер он был постоянно (резидентно), ни какие программы загружаться на комп не будут, просто должен быть компьютер на нем запущен драйвер одной единственной клавиши, которую периодически нажимают и на экране появляется код 1,0, пробел.
Цитата Сообщение от R71MT Посмотреть сообщение
Кроме аппаратных вещей можешь управлять системой по-своему желанию
я не хочу ничем управлять, только одной этой кнопкой. Ну если вам конкретика нужна, то представьте что комп управляет передатчиком высокой мощности и в космос уходит одна единственная фраза "Здравствуйте жители внеземного разума", а кнопку эту нажимает корова, у нее всего одна кнопка и она ее нажимает когда захочет, а программа (драйвер ) должна ожидать нажатие этой кнопки постоянно, и комп никогда не выключается и не перезагружается. Вот так наверно понятнее стала задача?
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
30.10.2016, 14:00 19
Если я не ошибаюсь, то работа с клавиатурой - двухуровневая:
1. По аппаратному прерыванию int09h - работа с портами
2. По программному прерыванию int16h.

По аппаратному цепляется русификатор (драйвер) клавиатуры, который обрабатывает коды от нажатия клавиш (они разной длины для разных клавиш) и помещает двубайтный Scan+ASCII коды в выбранной кодировке (например, CP866) в буфер клавиатуры.
По программному - это просто пользовательский интерфейс чтения из буфера клавиатуры.

Вы можете перехватить программное прерывание, и в ответ выдавать свои три символа, вместо одного введённого. Причём реальное чтение из буфера можете осуществлять из своего обработчика, вызывая исходный обработчик.
1
45 / 44 / 1
Регистрация: 11.07.2012
Сообщений: 1,024
31.10.2016, 15:03  [ТС] 20
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
По аппаратному цепляется русификатор (драйвер) клавиатуры
да мне бы хотелось аппаратное прерывание, оно же быстрее должно срабатывать наверно? А без прицепления русификатора тоже можно (чисто по кнопке) или обязательно с русификатором?

Добавлено через 5 минут
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
@@:jmp @b * * ; бесконечный цикл простоя
в моем коде нет вот этого простоя, этот код нужен, так получается? Т.е механизм драйвера такой: происходит подмена вектора прерывания и комп зависает (ждет это прерывание)? Но ведь такой метки нет , на которую указывает ссылка безусловного перехода @b?
Assembler
1
@@:jmp @b
Что происходит с процессором в этот момент?

Добавлено через 4 минуты
Мне казалось что аппаратный драйвер это некая резидентная программа, которая постоянно находится в оперативной памяти компьютера, и которая при первом запуске подменяет вектор прерывания и код вызываемой программы постоянно находится в оперативной памяти. И по нажатию "нужной" кнопки процессор сразу обращается к этому коду? А так получается что процессор подвисает?

Добавлено через 21 минуту
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
И переходите уже на FASM, а то долго мучиться будете.
Чем fasm лучше Masm он не правильно компилирует код? С ошибками, вы имеете в виду, и поэтому может не пойти?

Добавлено через 1 час 31 минуту
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.MODEL tiny
.386
.DATA
.CODE
org 100h
START:
STI ; разрешаю аппаратные прерывания
mov al,11111101b ;запрещаю все прерывания кроме прерываний от клавиатуры
out 21h,al
mov    ax,2509h           ; объявляю вектор прерывания клавиатуры для подмены адреса прерывания
mov    dx,perem          ; задаю адрес смещения для кода выполнения аппаратного прерывания
int 21h     ;заменяю вектор прерывания клавиатуры с системного на свой
@@: jmp @b
perem:
    mov al,'0'     ; начало кода для выполнения по срабатыванию нажатой клавиши
        int 29h
    mov al,'1'
        int 29h
    mov al,' '
        int 29h    ; окончание кода по срабатыванию прерывания
    mov   al,20h     ; указание процессору что текущее нажатие кнопки обработано и нужный код по прерыванию выполнился
    out   20h,al     ; указание процессору, что бы он ждал следующее нажатие кнопки и запустил бы снова свой код (10 )          
END START
указание не явного адреса на код выполняемой программы в строке 11 по ссылке perem нормально отработал, спасибо это я не понял, конечно так проще. А вот добавление строки 13 практически ничего не дало, единственно что программа не проходит до конца вниз, а останавливается на этом переходе. (раньше проходила во конца и выводила один раз на экран код 0,1, пробел. И потом еще срабатывала один раз по нажатию кнопки , в результате сколько бы не нажималась кнопка выходило 01 01 и все , теперь выходит 01 , что еще можно подправить в коде? Может быть добавить безусловный переход после 22 строки на 13ю? Где находится сейчас процессор после срабатывания кнопки на первое нажатие ? Регистр IP равен строке начала программы обработки прерывания (на 15й строке) . Дос в отладчике в этот момент пишет Program terminated normally. Что программа завершилась нормально, значит правильно, Дос понял что программа должна запуститься только один раз и не собирается ее запускать еще повторно?

Добавлено через 5 минут
Цитата Сообщение от R71MT Посмотреть сообщение
твоё нажатие клавиши, не даёт спокойно жить APIC
какое отношение APIS имеет к старому компу архитектуры 80386 на котором я провожу испытание Досовой программы? PS. APIC использовался в многоядерных/многопроцессорных системах, начиная с Intel Pentium (ядро P54). из вики.

Добавлено через 2 минуты
Цитата Сообщение от R71MT Посмотреть сообщение
Поставь терминал, и чтоб он тебе выдавал по-каждому нажатию клавиши по штуке баксов.
ну может так и будет, во первых бакс скоро рухнет, а во вторых модуль моей программы тоже будет сколько то стоить может быть как раз бакс, пока не знаю...

Добавлено через 3 минуты
Цитата Сообщение от R71MT Посмотреть сообщение
Клава самый основной ингредиент компа. IRQ1 о многом говорит
да именно по этому я и пишу для нее код, пока мысль у вас верная... Но программа все равно не работает, в чем причина, я думаю надо идти в сторону резидентных программ под Досом да? Поскольку она выполняется один раз и Дос пишет, все отлично я свою задачу выполнил, а на самом деле он ошибся, не такая была у него задача...

Добавлено через 4 минуты
еще наверно имеет смысл в отладчике посмотреть адреса векторов аппаратных прерываний и посмотреть какой адрес стоит в смещении 4* 9 =36 , там должен стоять адрес строки 15 кода программы у текущего сегмента, да?

Добавлено через 5 часов 36 минут
Вот нашел совет Завершение программы прерыванием 27H оставляет ее резидентной в памяти. может это мне поможет? Не могу пока найти чем можно посмотреть область памяти MCB до загрузки своей программы и после, что бы убедиться что вектор прерывания изменен и находится в нужном состоянии?

Добавлено через 3 минуты
А в каком месте кода программы надо ставить
Assembler
1
 INT 27h
?

Добавлено через 8 минут
Вот еще как можно, но тоже не работает Оставить программу резидентной можно с помощью функции 31H прерывания 21H
0
31.10.2016, 15:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.10.2016, 15:03
Помогаю со студенческими работами здесь

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

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

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

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


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

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