Ищу информацию о работе Ассемблера с клавиатурой

Тема в разделе "WASM.BEGINNERS", создана пользователем Gsan33, 4 фев 2007.

  1. Gsan33

    Gsan33 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    10
    В языке Visual Basic (и в C++) есть функция Keyboard_event. Во что она транслируется при переходе в машинный код? Похоже что она транслируется в некоторое обращение к работы с клавиатурой. Я и хотел бы найти подробное описание этого прерывания для современного ассемблера (к сожалению, в Инете нахожу только для старых DOS версий).

    Спасибо!
     
  2. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Оно транслируется в
    для С++ в ассемблерный код -
    CALL Keyboard_event
    для VisualBasic
    в псевдокод, для вызова функции Keyboard_event

    Что значит "современный ассебмлер"? Ассемблер с 1986 года в основной части не менялся.
     
  3. Gsan33

    Gsan33 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    10
    Что значит "современный ассебмлер"? Ассемблер с 1986 года в основной части не менялся.


    Ассемблер - как язык может и не менялся, а компьютеры сильно изменились. А книги, которые можно купить/скачать здороаво устарели. Вот мой пример: как например сбросить код непосредственно в буфер клавиатуры если операционная система это запрещает? А раньше это было возможно. И я прочел кучу бесполезной ифы про буфер и стек клавиатуры, а воспользоваться ими не могу.

    Под современным ассемблером я имел ввиду, тот, исходники которого пойдут на WIN XP (или другой современно ОС). Птому что огромное колическво исходников, которые можно скачать c разных сайтов, не компилируются и не работают под MASM32.
     
  4. Gsan33

    Gsan33 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    10
    Скажите - вот этому можно верить? все осталось без изменений?

    =================================
    Запись символа в буфер клавиатуры (05h int 16h)

    Вход: АН = 05h запись символа в буфер клавиатуры: СН = скан-код; CL = символ ASCII.
    Выход: AL = состояние: 00h — успешная запись; Olh — ошибка (буфер клавиатуры заполнен).
    С помощью этой функции можно осуществлять подыгрыш для программ, которые ожидают ввода с клавиатуры. Сам буфер клавиатуры организован по принципу кольца, имеет размер 16 байт и занимает в памяти диапазон адресов 0040h:001Eh...0040h:003Dh. В ячейке 0040h:001Ah хранится адрес начала буфера, а в ячейке 0040h: OOlCh — адрес конца. Если содержимое этих ячеек равно, то буфер пуст. Одному символу в буфере соответствует слово, в котором первый байт — скан-код клавиши, а второй — символ ASCII. Исследовать данную функцию можно с использованием операции сцепления (|) MS DOS. Для этого оформим фрагмент кода для определения наличия символа в буфере и его ввода в виде отдельной программы.

    ===================================
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Gsan33
    DOS никто не запрещал. Пиши под него. Виндоус может выполнять программы предназначенные для ДОСа.
    Да можно, все осталось без изменений в MS DOS будет работать.
    Компилируй MASM6.11 или TASM 5.0.
    Если хочешь создавать приложения для виндоуса. Изучай Win API, так как в виндоусе без него некуда.
    Процессоры усовершенствовались, появились новые режимы работы. Что привело к тому что в среде Win32 не действуют “законы” ДОСа. Поэтому там все по-другому, поэтому способ общения с ОС сместился с прерываний в сторону функций.
    Книжки всегда можно найти, нужные.
    Правда, мая стихия низкоуровневое программирование, так что обитаю на виртуальной машине в ДОСе :lol: .
     
  6. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    А ты для Windows хочешь писать или MS-DOS?
     
  7. Gsan33

    Gsan33 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    10
    К сожалению (( под Windows....

    правильно ли я понимаю, что мне не стоит пытаться написать программу с использованием прерываний (Int 09, Int 15) если я планирую запускать ее под Windows?

    И что если я пишу под Windows - единственный способ обратится к клавиатуре - библитека Win API??

    Но разве WIN API (keyboard_event) не транслируется в прерывания??

    Что то я совсем запуталси...
     
  8. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    Да единсвенный способ из юзерможе - винапи. 2 вариант драйвер и отуда уже прерывания.
    хз, мож и транслируется
     
  9. olegunya

    olegunya New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    1
    В. Кулаков “Программирование на аппаратном уровне” Глава 1 полностью о работе с клавиатурой.
     
  10. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Как я уже говорил, ассеблер НЕ МЕНЯЛСЯ. А описание DOS, WinAPI (и как оно там все вызывается) к ассемблеру никакого отношения не имеют. Это все уже отдельная документация, правда без которой программу написать не удастся.

    Если вы пишете под Вындовс, забудьте про всякие прерывания и все подобное с ним. В Win есть только громадный список доступных функций (вот это и есть WinAPI) с помощью которых (и только их) разрешается работать с внешним миром :)

    Зы - Никто не расскажет как работает keybd_event (потому что в разных версиях Win оно работает совсем по-разному, и в будущей версии будет работать тоже по другому)(имеется ввиду внутренняя ее реализация).

    Но самое главное читаем в описании функции:
    VOID keybd_event(BYTE bVk,
    BYTE bScan,
    DWORD dwFlags,
    PTR dwExtraInfo
    );
    Далее припоминаем, что WinAPI использует соглашение на вызов функций "как у паскаля", то есть параметры кладутся в стек в обратном порядке, и очищает стек вызывающая процедура. Но для такого высокого полета (еще вспоминать что-то!) придумали макрос "invoke ProcName Param1, Param2, ....". Итог - сторка текста в ассемблере выглядит примерно так:
    invoke keybd_event bVk, bScan, dwFlags, dwExtraInfo
    (притом каждый из параметров может быть и регистром)
    И эта вся кухня транслируется в
    push dwExtraInfo
    push dwFlags
    push bScan
    push bVk
    call keybd_event

    Смысла читать про ДОС, для работы в Win нет никакого вообще. Но для общего развития не помешает. Лучше возьмите пару мелких программ для Win (даже с этого сайта) и разберите как оно все фунциклирует да еще возьмите хорошую помощь по функциям WinAPI - этого вполне достаточно для написания программы.
     
  11. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    1) WinAPI могут работать и по Паскалевскому соглашению и по Сишному все зависит от настроек
    ml с ключем /Gc обрабатывает функции по Паскалевскому соглашению
    ml /Gd - Cи соглашение
    ml /Gz - Stdcall соглашение
    2) Можно обойтись без прерываний используя порты. Есть такая программа "UserPort" от Tomas Franzon exe и sys разблокирует обращения к любым портам при работе под Win32. Порты контроллера клавиатуры 060h-06Fh. Фрагмент обработчика прерывания от клавиатуры int 9, которое читает скан-код клавиши, подтверждает факт приема скан-кода, преобразует код в соответствии с переключателями и помещает преобразованный код в буфер клавиатуры
    Код (Text):
    1. in al,60h;читаем скан-код в порт 60h
    2. push ax
    3. in al,61h;читаем порт 61h
    4. or al,80h;старший бит байта из порта 61h в 1
    5. out 61h,al;подтверждаем факт приема скан-кода
    6. pop ax
    7. out 61h,al;восстановили байт в порту 61h
    а это фрагмент из программы под WinXP вывод в окошко скан-кода
    Код (Text):
    1. @@WM_CHAR: xor eax,eax
    2.     in al,60h
    3.     push eax
    4.     push offset fmat2;fmat2 db '%02d',0
    5.     push offset buffer
    6.     call _imp__wsprintfA
    7.     pop ecx
    8.     pop ecx
    9.     pop ecx
    10.     push offset buffer
    11.     push 1001
    12.     push hwnd
    13.         call _imp__SetDlgItemTextA@12