Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2011, 01:29   #1
Merovingian
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 30
По умолчанию работа с буфером клавы

Нужна помощь в задаче: нужно определить размер буфера клавиатуры.
Читал, что он размером 32 байта вроде как. Нужно программно получить эту цифру(32). Как точно - не знаю, но вроде догадываюсь, направьте на путь истиный:
Есть прога которая пишет в буфер:
(часть)
PHP код:
union REGS  rg;
unsigned int   i;

for(
i=0i<64000i++) // на 16 иттерации, как я понял, бипер запищит, 
//т.к. буфер переполнится
{
  
rg.h.ah 5;
  
rg.h.cl '*'// записываем в буфер символ
  
rg.h.ch 9;
  
int86(0x16, &rg, &rg);

У меня не пищит, у меня ноут)) Но дело не в этом.
Как программно обработать то, что бипер работал?
Merovingian вне форума Ответить с цитированием
Старый 31.03.2011, 09:18   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

[AT]
Expects: AH 05H
CH scan code to store
CL ASCII character code or extended ASCII keystroke
─────────────────────────────────── ────────────────────────────── ─
Returns: AL 0=successfully stored
1=not stored (no room in buffer)
─────────────────────────────────── ────────────────────────────── ─
Info: This can be used to stuff data into the keyboard buffer, as if
the user had typed the keys manually.

This can be used by keyboard macro programs and other such
utilities.

Код:
#include <dos.h>
int main(){
union REGS  rg;
unsigned int   i,n;

for(i=0,n=0; i<64000; i++) // на 16 иттерации, как я понял, бипер запищит,
//т.к. буфер переполнится
{
  rg.h.ah = 5;
  rg.h.cl = '*'; // записываем в буфер символ
  rg.h.ch = 9;
  int86(0x16, &rg, &rg);
  if(rg.h.al==0) n++;
}
printf("%d",n);
return 0;
}
Каждое нажатие в буфере занимает 2 байта, но больше 15 нажатий запихивать не хочет
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru

Последний раз редактировалось alexcoder; 31.03.2011 в 09:20.
alexcoder вне форума Ответить с цитированием
Старый 31.03.2011, 09:58   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Merovingian
Можно использовать чтение буфера клавиатуры по адресам
0040:001Ah указатель на логическое начало буфера
0040:001Ch указатель на логический конец буфера
0040:001Eh память для хранения ASCII/скан-кодов начало
0040:003Eh конец буфера
0040:0080h указатель на физическое начало буфера
0040:0082h указатель на физический конец буфера

После нажатия на клавишу ее скан-код из клавиатуры передается на системную плату, где временно запоминается. Программа BIOS INT 09h, записанная в ПЗУ, выбирает скан-код из микросхемы преобразует ее в ASCII-символ и записывает сам символ и его скан-код в буфер клавиатуры.
Буфер клавиатуры — буфер кольцевого типа, состоит из 32 последовательно расположенных байтов, которые находятся в области данных BIOS. Этот буфер зарезервирован программами BIOS INT 09h и INT 16h в качестве связующего звена для хранения и передачи данных клавиатуры. INT 09h получает данные от клавиатуры и запоминает их в буфере, а INT 16h выбирает данные из буфера и передает их прикладной программе.

Информация относящаяся к буферу клавиатуры может быть просмотрена с помощью отладчика DEBUG. Запустите отладчик и по приглашению в виде знака минус введите: D 40:80 L4
Эта команда выводит дамп (содержимое) 4 байт, расположенных в сегменте 40h со смещением 80h. По адресу 40:80h находится двухбайтовое смещение начала буфера клавиатуры, а в 40:82h хранится смещение конца буфера.
Двухбайтовая величина смещения, записанная в 40:80h, преобразуется микропроцессором во время считывания в 001Eh, а записанная по адресу 40:82h — в 003Eh. Используются только величины смещений, так как BIOS полагает, что сегментный адрес буфера клавиатуры равен 40h (сегментный адрес). Таким образом, начало буфера клавиатуры имеет адрес 0040:001Eh, а конец — 0040:003Eh, байт с адресом 0040:003Eh буферу не принадлежит. 3Eh-1Eh=20h=32 Так как для записи кода каждой клавиши требуется два байта (скан-код и ASCII-код) поэтому буфер может запоминать до 16 кодов нажатых клавиш. Чтобы увидеть содержимое буфера введите: D 40:1E L20
По нечетным адресам расположены скан-код нажатых клавиш, а по четным ASCII-коды. В предыдущем дампе команда начинается с буквы «d», расположенной в 3 строке. Так как буфер клавиатуры кольцевой, текущее положение «головы» (первая занятая ячейка в буфере) и «хвоста» (указатель на первую свободную ячейку) постоянно меняются. Текущие адреса «головы» и «хвоста» хранятся по адресам 40:1h и 40:1Ch, чтобы их увидеть наберите: D 40:1A L4
С адреса 400h начинается область памяти, используемая программами BIOS для хранения данных, в том числе для буфера клавиатуры. Буфер начинается с адреса 41Eh и заканчивается адресом 43Dh. Все 32 адреса сгруппированы попарно — один байт для хранения ASCII-кода, выработанного программой INT 09h, а второй — для хранения скан-кода. Смещения первого и последнего байтов буфера указывают на положение самого буфера относительно адреса 400h. Эти смещения хранятся в двух последовательных словах по адресам 480h и 482h. Эти указатели позволяют программе INT 09h находить буфер клавиатуры.
Два дополнительных указателя «голова» и «хвост» используются для отслеживания содержимого буфера. Эти указатели находятся в области данных BIOS, их адреса — 0040:001Ah и 0040:001Ch. «Голова» и «хвост» указывают на позицию справа от возврата каретки (0FFFFh для 101-клавишной клавиатуры). «Хвост» указывает на ту позицию, в которую будут занесены данные о следующем нажатии на клавишу, «голова» указы-вает на первый введенный символ (логическое начало буфера). Если «голова» равна «хвосту», то INT 09h и INT 16h считают, что буфер пуст. Под словом «пуст» понимается не затирание буфера, а одинаковое положение «головы» и «хвоста». При нажатии на клавиши указатель «головы» остается неизменным, указывая на логическое начало буфера. Когда все 16 элементов буфера заполнятся, «хвост» после достижения конца буфера переходит на начало буфера. В последнюю ячейку данные не заносятся, вместо этого порождается сигнал о переполнении буфера клавиатуры. Поэтому в буфере клавиатуры объемом 16 слов всегда хранится 15 кодов нажатых клавиш.

Последний раз редактировалось Mikl___; 31.03.2011 в 13:23.
Mikl___ вне форума Ответить с цитированием
Старый 31.03.2011, 18:12   #4
Merovingian
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 30
По умолчанию

Спасибо большое! Разобрался))
Merovingian вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с буфером обмена ОС truder JavaScript, Ajax 2 28.02.2011 05:21
Работа с буфером обмена. star007 Помощь студентам 0 16.06.2010 20:37
Работа с буфером обмена Gerzs Общие вопросы Delphi 2 26.03.2010 15:15
Работа с буфером обмена АлексейМк Общие вопросы C/C++ 1 05.08.2009 00:24
работа с буфером данных alexs2141 Общие вопросы C/C++ 5 06.06.2008 12:45