![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 08.11.2017
Сообщений: 48
|
![]()
Здравствуйте, пытаюсь разобраться с буфером клавиатуры, прошу помочь объяснить некоторые моменты:
1. как работает процедура PrnHex, сам вникал, но так и не понял почему используются именно эти команды (особенно как работает команда das не могу понять почему вычитает именно 60 и 66) 2. также не могу понять эту часть кода: как наша клавиша загружается в ax (с прерыванием 16h и 0 функцией попроще (я вроде понял), а тут напрямую организована работа с буфером я понять не смог): Код:
Код взят мной с форума для ознакомления: Код:
|
![]() |
![]() |
![]() |
#2 | |
Форумчанин
Регистрация: 17.10.2018
Сообщений: 184
|
![]() Цитата:
2. Клавиатура аппаратно дёргает прерывание 9 оно же IRQ 1, вызывая обработчик БИОСа. Он в свою очередь опрашивает клавиатуру на предмет что изменилось/нажалось/отпустилось и записывает сканкод в кольцевой буфер на 16 символов, расположенный по адресу 40:1E, при этом обновляя указатель на голову. Когда вызываете прерывание 0х16 происходит считывание с кольцевого буфера и его обновление, а не опрос клавиатуры как можно предположить. Т.о. ваша программа вместо корректного запроса у БИОСа что было нажато последовательно, в обход нагло считывает первый сканкод и удаляет всё остальное. Код:
|
|
![]() |
![]() |
![]() |
#3 | |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]() Цитата:
Код:
когда ст.бит перейдёт из AL в AH (переполнение AL = 1.0000.0000). -- AF взводится в том случае, когда из мл.тетрады AL, бит переходит в ст.тетраду AL (0001.0000). Теперь, смотрим на код процедуры "PrnHex".. Здесь инструкцией SBB мы принудительно от тетрады(AL) отнимаем байт(69h). Значит по псевдо-коду, DAS всегда будет отнимать от AL 60h, т.к. AL всегда будет >99h. При этом по флагам будет вычитаться ещё и CF и 06h. Код:
Нашедшего выход - затаптывают первым..
|
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 08.11.2017
Сообщений: 48
|
![]()
R71MT, Спасибо) Очень помогли разобрался с das)) Просто не сразу понял что по умолчанию 60 отнимается)) Из-за этого запутался))
Последний раз редактировалось Alexis_777; 27.11.2018 в 22:02. |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 08.11.2017
Сообщений: 48
|
![]()
Может кто-нибудь сможет объяснить как работает данная конструкция)) А то я не могу понять этого (наверное, слишком сложно для меня):
Код:
|
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
это/всё для LODSW, который читает в AX из DS:SI
чтобы получить в SI указатель на начало буфера, сначала в AX берётся смещение с адреса 1Ah (внутри буфера), а потом к нему прибавляется база 400h. кстати один-и-тотже адрес, можно указывать двумя способами, т.е. вот эти 2 адреса одинаковы: 0040:001Ah и 0000:041Ah - в коде выше приводится второй вариант.
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 05.09.2016
Сообщений: 135
|
![]()
Bce mak u cmpoku y4u
Немного о GoAsm.
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Паскаль: Помогите понять основу для написания простейшей программы. Не могу понять суть. | romanya | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 18.03.2016 20:35 |
Не могу понять в чем ошибка...(работа с файлами) | Lapochka | Помощь студентам | 0 | 28.04.2012 17:58 |
работа с циклами, не могу понять | theGamer | Помощь студентам | 1 | 13.11.2011 13:08 |
Работа с циклом ( находим сумму) - не могу понять , где ошибся ) | zipo666 | Помощь студентам | 3 | 01.11.2011 12:51 |
Работа с клавиатурой посредством dos.h - geninterrupt | templton | Общие вопросы C/C++ | 3 | 06.04.2011 09:18 |