функции ввода (встроенный ассемблер)
Модератор: Модераторы разделов
- COKPOWEHEU
- Сообщения: 47
- ОС: Debian (ядро 4.4.2) / Win7
функции ввода
Недавно баловался с функциями in/out в asm'e на Винде. Особенно понравилась in AL,60h. Непосредственный ввод с клавы. Написял прогу, которая в DOS-эмуляторе распознает до 8 (! в DirectInput максимум-4)одновременно нажатых клавиш. Причем сбоев (когда их отпускаю одновременно, например) вроде не было. Теперь хочется узнать как что-нибудь подобное написать в Линуксе (OpenSuSE11) и соответственно gcc. Пытался писать
asm("in al,60h"); вместо al пробовал ax и eax, вместо 60h - 0x60. еще пробовал % ставить везде. Не работает. Подскажите как надо. Еще лучше вместо Асма что-нибудь попроще. Нужно определение нажатых в данный момент клавиш.
asm("in al,60h"); вместо al пробовал ax и eax, вместо 60h - 0x60. еще пробовал % ставить везде. Не работает. Подскажите как надо. Еще лучше вместо Асма что-нибудь попроще. Нужно определение нажатых в данный момент клавиш.
- serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
- Контактная информация:
Re: функции ввода
Может стоит использовать curses/ncurses?
- Stauffenberg
- Сообщения: 2042
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
Re: функции ввода
COKPOWEHEU писал(а): ↑29.04.2009 16:35Еще лучше вместо Асма что-нибудь попроще. Нужно определение нажатых в данный момент клавиш
man showkey
Labor omnia vincit
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
- кодировщик
- Сообщения: 974
- Статус: зарёган в пятницу 13
- ОС: Linux
Re: функции ввода
COKPOWEHEU писал(а): ↑29.04.2009 16:35Недавно баловался с функциями in/out в asm'e на Винде. Особенно понравилась in AL,60h. Непосредственный ввод с клавы. Написял прогу, которая в DOS-эмуляторе распознает до 8 (! в DirectInput максимум-4)одновременно нажатых клавиш. Причем сбоев (когда их отпускаю одновременно, например) вроде не было. Теперь хочется узнать как что-нибудь подобное написать в Линуксе (OpenSuSE11) и соответственно gcc. Пытался писать
asm("in al,60h"); вместо al пробовал ax и eax, вместо 60h - 0x60. еще пробовал % ставить везде. Не работает. Подскажите как надо. Еще лучше вместо Асма что-нибудь попроще. Нужно определение нажатых в данный момент клавиш.
использовали nasm?!
- Stauffenberg
- Сообщения: 2042
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
Re: функции ввода
COKPOWEHEU писал(а): ↑29.04.2009 16:35Теперь хочется узнать как что-нибудь подобное написать в Линуксе (OpenSuSE11) и соответственно gcc. Пытался писать
asm("in al,60h"); вместо al пробовал ax и eax, вместо 60h - 0x60. еще пробовал % ставить везде. Не работает
Дык а что пишет? Вы исходник лучше выложите. Посмотрите это.
Как я понял, он хочет c AT&T синтаксисом поиграть
Labor omnia vincit
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Re: функции ввода
COKPOWEHEU писал(а): ↑29.04.2009 16:35asm("in al,60h"); вместо al пробовал ax и eax, вместо 60h - 0x60. еще пробовал % ставить везде. Не работает. Подскажите как надо. Еще лучше вместо Асма что-нибудь попроще. Нужно определение нажатых в данный момент клавиш.
на Си как-то так
Код: Выделить всё
#include <asm/io.h>
#include <sys/io.h>
#include <unistd.h>
....
if( ioperm(0x60,1,1) == 0 ) { // разрешить доступ к порту
char state = inb_p(0x60); // считать байт с задержкой
.....
}
..
запускать подобную программу с правами суперпользователя конечно же
Разработка программ для *nix
- Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
- Контактная информация:
Re: функции ввода
Если всё-таки обязательно хочется ассемблера - inb %al, 0x60 - если не ошибаюсь...
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Re: функции ввода
если все хорошо помню:
вроде как-то так...
открываете устройство клавиатуры и читаете =)))
Код: Выделить всё
movl $3, %eax
movl $descriptor, %ebx
movl $address, %ecx
movl $1, %edx
int $0x80
вроде как-то так...
открываете устройство клавиатуры и читаете =)))
- COKPOWEHEU
- Сообщения: 47
- ОС: Debian (ядро 4.4.2) / Win7
Re: функции ввода
В линуксе далеко до профессионала. Пытался встроенный в ГСС ассемблер. А когда на винде (точнее в эмуляции ДОСа) TASM.
То что именно ассемблер - неважно, лишь бы хот бы 3-4 клавиши одновременно.
Снизойдите к чайнику. Разенхертз, куда что записывает система?
То что именно ассемблер - неважно, лишь бы хот бы 3-4 клавиши одновременно.
Снизойдите к чайнику. Разенхертз, куда что записывает система?
Re: функции ввода
COKPOWEHEU писал(а): ↑09.05.2009 03:46В линуксе далеко до профессионала. Пытался встроенный в ГСС ассемблер. А когда на винде (точнее в эмуляции ДОСа) TASM.
То что именно ассемблер - неважно, лишь бы хот бы 3-4 клавиши одновременно.
Снизойдите к чайнику. Разенхертз, куда что записывает система?
у меня читать с клавиатуры можно открыв /dev/input/event0 и вызывая ioctl команды. почитать о системе ввода можно здесь - все снабжено примерами программ.
Re: функции ввода
А может вам поставить dosemu и там тоже на TASM-е баловаться?
А то есть у меня такое подозрение, что в защищенном режиме командочки обращения к портам (in/out которые) являются привелигированными, и могут быть выполнены только в нулевом кольце, и обычные программки (в user-space) просто будут валится по исключению.
А то есть у меня такое подозрение, что в защищенном режиме командочки обращения к портам (in/out которые) являются привелигированными, и могут быть выполнены только в нулевом кольце, и обычные программки (в user-space) просто будут валится по исключению.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: функции ввода
всё так, только не валится - исключение перехватит ядро, и не порушит всё, а что-то вернёт молча. может даже и порт прочитает. В WinXP так было, читало, но не очень быстро(если я не ошибаюсь). Думаю в Linux так-же, хотя не проверил...
Re: функции ввода
Может я не в тему...
скорее даже просто оффтопик. попробуем поиграть в телепата)
"in AL,60h" - как я понимаю вы вытаетесь прочитать с аппаратного порта номер "60h"(клавиатура) байт данных и записать его в ергистр AL?
и так я понимаю, то что вы компидите под линукс - вы это пишите в том-же стиле, что и для дос-эмулятора... да? т.е. не модуль ядра, не драйвер, ни т.п., да?
Теперь вы мне вот что скажите - а с какого перепугу вы решили что ОС пустит вас из "userspace" рулить устройством напрямую через порты ввода-вывода? это же не DOS и не Win95/98.
Вот если бы вы "in AL,60h" под вендо-хренью запускали - как вы думаете - что-нибудь у вас заработало бы? нет. венда "старше 2000-й (включительно)" не пустит вас напрямую управлять устройством через аппаратные порты ввода-вывода, если только вы не драйвер пишите...
А с чего вы решили что под Linux оно будет работать из userspace?
скорее даже просто оффтопик. попробуем поиграть в телепата)
"in AL,60h" - как я понимаю вы вытаетесь прочитать с аппаратного порта номер "60h"(клавиатура) байт данных и записать его в ергистр AL?
и так я понимаю, то что вы компидите под линукс - вы это пишите в том-же стиле, что и для дос-эмулятора... да? т.е. не модуль ядра, не драйвер, ни т.п., да?
Теперь вы мне вот что скажите - а с какого перепугу вы решили что ОС пустит вас из "userspace" рулить устройством напрямую через порты ввода-вывода? это же не DOS и не Win95/98.
Вот если бы вы "in AL,60h" под вендо-хренью запускали - как вы думаете - что-нибудь у вас заработало бы? нет. венда "старше 2000-й (включительно)" не пустит вас напрямую управлять устройством через аппаратные порты ввода-вывода, если только вы не драйвер пишите...
А с чего вы решили что под Linux оно будет работать из userspace?
Re: функции ввода
UPD: прочитал тему. Alxn1 дело говорит.
Сам я с этим столкнулся ещё под вендой. Мы на лабах очень замечательно программировали контроллер последовательного порта через In-Out. Под досом и под win95|98.
Программировали в частности для "перехвата мышки" - протокол мышиный простой, и заставить бегать в по экрану "собственный курсор" - большого труда не составляло.
А когда я это (скомпиленное) запускал под 2000-й оно уже не работало. Мелкософтовцы "открыли америку" и начали реализовывать нормальное разделение доступа к устройствам.
С *nix-системами-же как я понимаю дело так уже изначально обстояло.
В общем поправьте меня ежели я ошибаюсь )
Сам я с этим столкнулся ещё под вендой. Мы на лабах очень замечательно программировали контроллер последовательного порта через In-Out. Под досом и под win95|98.
Программировали в частности для "перехвата мышки" - протокол мышиный простой, и заставить бегать в по экрану "собственный курсор" - большого труда не составляло.
А когда я это (скомпиленное) запускал под 2000-й оно уже не работало. Мелкософтовцы "открыли америку" и начали реализовывать нормальное разделение доступа к устройствам.
С *nix-системами-же как я понимаю дело так уже изначально обстояло.
В общем поправьте меня ежели я ошибаюсь )
Re: функции ввода
По-моему венда говорит, что "программа выполнила недопустимую операцию". А linux, думаю, SIGSEGV или SIGBUS пошлет. Врятли оно там что-то будет читать и эмулировать - доступ к портам неядро иметь не должно, по идее. Хотя у меня и в мыслях никогда не из ядреного модуля к портам обращаться не было, так что я не уверен в своих догадках. А пробовать лень
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: функции ввода
мне было не лень... уж не помню что я делал, может BIOS читал/писал, может порты, но что-то помню получалось... году так в 2002м, т.ч. точно не помню...
а сейчас тоже лень
ЗЫЖ хочу подчеркнуть, что напрямую точно не получится, этого не даст сделать CPU.
- COKPOWEHEU
- Сообщения: 47
- ОС: Debian (ядро 4.4.2) / Win7
Re: функции ввода
Я хочу написать программу на С которая отслеживает нажатие нескольких клавиш одновременно (было бы неплохо если и мыша, но не обязательно).
Stauffenberg а что вы имели в виду под "man showkey"?
Если можно, с конкретными примерами кода (и указанием куда записывается код клавиши)
Stauffenberg а что вы имели в виду под "man showkey"?
Если можно, с конкретными примерами кода (и указанием куда записывается код клавиши)
- serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
- Контактная информация:
Re: функции ввода
Кажется, что не мешало бы сначала для себя ответить на след. вопросы... В какой системе - DOS, Linux? В каком окружении - виртуальная консоль, X-сервер, DE?COKPOWEHEU писал(а): ↑10.05.2009 17:26Я хочу написать программу на С которая отслеживает нажатие нескольких клавиш одновременно (было бы неплохо если и мыша, но не обязательно).
- Stauffenberg
- Сообщения: 2042
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
Re: функции ввода
COKPOWEHEU писал(а): ↑10.05.2009 17:26Я хочу написать программу на С которая отслеживает нажатие нескольких клавиш одновременно (было бы неплохо если и мыша, но не обязательно).
Stauffenberg а что вы имели в виду под "man showkey"?
Я имел в виду, что разобрться в вопросе, возможно поможет showkey (:
Вот еще пару линков:
http://freeworld.thc.org/papers/writing-li...l-keylogger.txt
http://gunnarwrobel.de/wiki/Linux-and-the-keyboard.html
Labor omnia vincit
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Re: функции ввода
COKPOWEHEU писал(а): ↑10.05.2009 17:26Я хочу написать программу на С которая отслеживает нажатие нескольких клавиш одновременно (было бы неплохо если и мыша, но не обязательно).
Для начала хотелось бы всё-таки получить ответ на вопрос, которай задал serzh-z:
Потом я не понял, зачем привлекать для этих целей ассемблер. В чём преимущество in AL,60h перед inb(0x60) ?
Также я не уверен, что программа, которая просто читает 60-й порт, даже под Windows будет нормально распознавать ВСЕ нажатые клавиши.
Как распознаётся момент нажатия и отпускания клиавиши?
А больше 8 одновременно нажатых клиавишь получалось распознавать?
Когда я начал писать программы, работающие с графикой, то обнаружил, что как в svgalib, так и в xlib есть свои нормальные средства работы с клавиатурой.
В svgalib при любом нажатии и отпускании клавиши (а также при перемещении мыши и нажатии и отпускании её кнопок) вызывается специально указанная функция, которой передаётся код клавиши и признак её нажатия/отпускания. Причём, ВСЕ клавиши равны (точнее почти все -- Alt+Fn всё-таки вызывает переключение на другую консоль и мне пока не удалось это заблокировать).
В иксах ситуация аналогичная (только коды немного другие); нужно зарегистрировать события нажатия и отпускания кливишей. И при возникновении такого события из специального поля можно будет прочитать код клавиши.
Re: функции ввода
Я когда-то, около 20 лет назад, написал программу VT52 -- эмулятор терминала VT-52. Были тогда машины типа PDP-11, и стали появляться персоналки. Ну и (в частности) захотелось пользоваться редактором K52 (а про советские полные аналоги VT-52 я даже и не слышал). Программа написана на Borland Pascal, сделана по-простому. В цикле: если бьл введён код с клавиатуры, то он посылается в COM-пор. Если пришёл кодд c COM-порта, то он либо выводится на экран, либо выполняется какое-то действие.Denjs писал(а): ↑10.05.2009 00:15UPD: прочитал тему. Alxn1 дело говорит.
Сам я с этим столкнулся ещё под вендой. Мы на лабах очень замечательно программировали контроллер последовательного порта через In-Out. Под досом и под win95|98.
Программировали в частности для "перехвата мышки" - протокол мышиный простой, и заставить бегать в по экрану "собственный курсор" - большого труда не составляло.
А когда я это (скомпиленное) запускал под 2000-й оно уже не работало.
Для приёма данных с COM-порта устанавливается вектор прерывания и пришедшие данные записываюся в кольцевой буфер.
Этой программой (с разными модификациями) пользуемся до сих пор для работы с контроллерами. Работает и под Windows XP.
То, что программа не работала под 2000-й, причина, возможно, была другая -- COM-порт был уже захвачен мышой или чем-то другим. Я не помню. работала ли она под 2000 (сам перешёл от 98 к XP), но, по-моему, уже под 98 бывали проблемы. Если запустить эту программу из FARа или VC, то в другом окне она уже не запустится. Пока не будет снят запускавший её FAR (VC), т.е. при первом запуске эта программа "захватывала" COM-порт и никому его не отдавала.
Также в XP (или в 2000) при запуске программы винда предупреждала, что кто-то пытается получить доступ к портам и требовала разрешения на это.
- COKPOWEHEU
- Сообщения: 47
- ОС: Debian (ядро 4.4.2) / Win7
Re: функции ввода
Я хочу распознавать нажата ли клавиша, момент нажатия не нужен. Лучше всего в X-window (KDE3.5 - не знаю важно ли. В принципе кроме него стоят KDE4 и Gnome), в перспективе - OpenGL. Язык написания предпочтительнее С++.
Stauffenberg. А почему первая ссылка не пашет?
Насчет ассемблера убедили - в данном случае неэффективно.
Stauffenberg. А почему первая ссылка не пашет?
Насчет ассемблера убедили - в данном случае неэффективно.
- Stauffenberg
- Сообщения: 2042
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
Re: функции ввода
пашет
Labor omnia vincit
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Re: функции ввода
Да уж, 8 клавиш..., мне что-то думалось что это аппаратное ограничение там, но раз уж человек говорит...,
COKPOWEHEU если найдёте как читать хотя бы 4 одновременно причём любых, отпишитесь,
очень не хватает.
COKPOWEHEU если найдёте как читать хотя бы 4 одновременно причём любых, отпишитесь,
очень не хватает.
Re: функции ввода
MiK13 писал(а): ↑12.05.2009 15:46Я когда-то, около 20 лет назад, написал программу VT52 -- эмулятор терминала VT-52. Были тогда машины типа PDP-11, и стали появляться персоналки. Ну и (в частности) захотелось пользоваться редактором K52 (а про советские полные аналоги VT-52 я даже и не слышал). Программа написана на Borland Pascal, сделана по-простому. В цикле: если бьл введён код с клавиатуры, то он посылается в COM-пор. Если пришёл кодд c COM-порта, то он либо выводится на экран, либо выполняется какое-то действие.Denjs писал(а): ↑10.05.2009 00:15UPD: прочитал тему. Alxn1 дело говорит.
Сам я с этим столкнулся ещё под вендой. Мы на лабах очень замечательно программировали контроллер последовательного порта через In-Out. Под досом и под win95|98.
Программировали в частности для "перехвата мышки" - протокол мышиный простой, и заставить бегать в по экрану "собственный курсор" - большого труда не составляло.
А когда я это (скомпиленное) запускал под 2000-й оно уже не работало.
Для приёма данных с COM-порта устанавливается вектор прерывания и пришедшие данные записываюся в кольцевой буфер.
Этой программой (с разными модификациями) пользуемся до сих пор для работы с контроллерами. Работает и под Windows XP.
То, что программа не работала под 2000-й, причина, возможно, была другая -- COM-порт был уже захвачен мышой или чем-то другим. Я не помню. работала ли она под 2000 (сам перешёл от 98 к XP), но, по-моему, уже под 98 бывали проблемы. Если запустить эту программу из FARа или VC, то в другом окне она уже не запустится. Пока не будет снят запускавший её FAR (VC), т.е. при первом запуске эта программа "захватывала" COM-порт и никому его не отдавала.
Также в XP (или в 2000) при запуске программы винда предупреждала, что кто-то пытается получить доступ к портам и требовала разрешения на это.
У вас это все работало потому, что под DOS написано. В Windows DOS-программы запускаются совсем не так, как нативные приложения. Они работают во-первых в эмуляторе (NTVDM), который, во-вторых, переводит во время своей работы процессор в режим V86 (при переключении контекста на NTVDM CPU переходит в режим V86, при обратном переключении - в защиенный режим). Это специальный режим эмуляции (виртуализации) реального режима вот для именно таких случаев. NTVDM перехватывает весь ввод-вывод, дергает обработчики прерываний когда нужно и все такое. COM-порты он тоже эмулирует, скорее всего (ну, точнее виртуализирует, как сейчас говорят) Так что ничего удивительного в этом нет. Нативное приложение ни в Windows ни в Linux ничего такого сделать не сможет - ни обработчики прерываний переопределить (не говоря уже о том, что в защищенном режиме таблица векторов прерываний не по 0-му адресу лежит, да и вообще по-другому устроена, и, собственно, доступна только из адресного пространства ядра - не забываем про виртуальную память), ни к портам ввода-вывода доступ иметь - все такие действия просто приводят к вызову соответствующего исключения (особый тип прерывания - в защищенном режиме прерывания аж 3-х типов бывают), обработчик которого в современных ОС приводит к останову и выгрузке провинившегося процесса. А в эмуляторах, типа NTVDM или dosemu (dosbox совсем по-другому работает, там настоящая эмуляция, а не виртуализация за счет V86-режима), конечно, это все возможно, но там тоже не прямой доступ к оборудованию, как бы не казалось и не хотелось
Re: функции ввода
скажите, пожалуйста, где может понадобиться 4 одновременно нажатые клавиши?
Re: функции ввода
RasenHerz, легко, в любой игре/эмуляторе.
Тут не стоит вопрос где надо, вопрос в том как сделать.
Тут не стоит вопрос где надо, вопрос в том как сделать.
- COKPOWEHEU
- Сообщения: 47
- ОС: Debian (ядро 4.4.2) / Win7
Re: функции ввода
Stauffenberg. Да, пашет. Вчера что-то не открывалась.
"Да уж, 8 клавиш..., мне что-то думалось что это аппаратное ограничение там, но раз уж человек говорит...,
COKPOWEHEU если найдёте как читать хотя бы 4 одновременно причём любых, отпишитесь,
очень не хватает." В винде я знаю только DirectInput. В DOSe та прога (см выше). Только она ДО 8 клавиш, каких - не помню Но не любых. Там какая-то фигня, некоторые клавиши запрещают нажимать другие. 8 одновременно нажатых - это мой рекорд Но так - самый крутой ввод под DOS что я видел.
А в Линуксе - не знаю, хотел узнать, вот и написал.
"Да уж, 8 клавиш..., мне что-то думалось что это аппаратное ограничение там, но раз уж человек говорит...,
COKPOWEHEU если найдёте как читать хотя бы 4 одновременно причём любых, отпишитесь,
очень не хватает." В винде я знаю только DirectInput. В DOSe та прога (см выше). Только она ДО 8 клавиш, каких - не помню Но не любых. Там какая-то фигня, некоторые клавиши запрещают нажимать другие. 8 одновременно нажатых - это мой рекорд Но так - самый крутой ввод под DOS что я видел.
А в Линуксе - не знаю, хотел узнать, вот и написал.
Re: функции ввода
Хех, жалко, dinput та же лажа, ну в линуксе проще всего получить кнопки, если конечно x есть:
#include <X11/Xlib.h>
char buf[32];
dpy = XOpenDisplay( NULL );
XQueryKeymap( dpy, buf );
где каждый бит кнопка.
#include <X11/Xlib.h>
char buf[32];
dpy = XOpenDisplay( NULL );
XQueryKeymap( dpy, buf );
где каждый бит кнопка.