В языке Visual Basic (и в C++) есть функция Keyboard_event. Во что она транслируется при переходе в машинный код? Похоже что она транслируется в некоторое обращение к работы с клавиатурой. Я и хотел бы найти подробное описание этого прерывания для современного ассемблера (к сожалению, в Инете нахожу только для старых DOS версий). Спасибо!
Оно транслируется в для С++ в ассемблерный код - CALL Keyboard_event для VisualBasic в псевдокод, для вызова функции Keyboard_event Что значит "современный ассебмлер"? Ассемблер с 1986 года в основной части не менялся.
Что значит "современный ассебмлер"? Ассемблер с 1986 года в основной части не менялся. Ассемблер - как язык может и не менялся, а компьютеры сильно изменились. А книги, которые можно купить/скачать здороаво устарели. Вот мой пример: как например сбросить код непосредственно в буфер клавиатуры если операционная система это запрещает? А раньше это было возможно. И я прочел кучу бесполезной ифы про буфер и стек клавиатуры, а воспользоваться ими не могу. Под современным ассемблером я имел ввиду, тот, исходники которого пойдут на WIN XP (или другой современно ОС). Птому что огромное колическво исходников, которые можно скачать c разных сайтов, не компилируются и не работают под MASM32.
Скажите - вот этому можно верить? все осталось без изменений? ================================= Запись символа в буфер клавиатуры (05h int 16h) Вход: АН = 05h запись символа в буфер клавиатуры: СН = скан-код; CL = символ ASCII. Выход: AL = состояние: 00h — успешная запись; Olh — ошибка (буфер клавиатуры заполнен). С помощью этой функции можно осуществлять подыгрыш для программ, которые ожидают ввода с клавиатуры. Сам буфер клавиатуры организован по принципу кольца, имеет размер 16 байт и занимает в памяти диапазон адресов 0040h:001Eh...0040h:003Dh. В ячейке 0040h:001Ah хранится адрес начала буфера, а в ячейке 0040h: OOlCh — адрес конца. Если содержимое этих ячеек равно, то буфер пуст. Одному символу в буфере соответствует слово, в котором первый байт — скан-код клавиши, а второй — символ ASCII. Исследовать данную функцию можно с использованием операции сцепления (|) MS DOS. Для этого оформим фрагмент кода для определения наличия символа в буфере и его ввода в виде отдельной программы. ===================================
Gsan33 DOS никто не запрещал. Пиши под него. Виндоус может выполнять программы предназначенные для ДОСа. Да можно, все осталось без изменений в MS DOS будет работать. Компилируй MASM6.11 или TASM 5.0. Если хочешь создавать приложения для виндоуса. Изучай Win API, так как в виндоусе без него некуда. Процессоры усовершенствовались, появились новые режимы работы. Что привело к тому что в среде Win32 не действуют “законы” ДОСа. Поэтому там все по-другому, поэтому способ общения с ОС сместился с прерываний в сторону функций. Книжки всегда можно найти, нужные. Правда, мая стихия низкоуровневое программирование, так что обитаю на виртуальной машине в ДОСе .
К сожалению (( под Windows.... правильно ли я понимаю, что мне не стоит пытаться написать программу с использованием прерываний (Int 09, Int 15) если я планирую запускать ее под Windows? И что если я пишу под Windows - единственный способ обратится к клавиатуре - библитека Win API?? Но разве WIN API (keyboard_event) не транслируется в прерывания?? Что то я совсем запуталси...
Да единсвенный способ из юзерможе - винапи. 2 вариант драйвер и отуда уже прерывания. хз, мож и транслируется
Как я уже говорил, ассеблер НЕ МЕНЯЛСЯ. А описание 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 - этого вполне достаточно для написания программы.
1) WinAPI могут работать и по Паскалевскому соглашению и по Сишному все зависит от настроек ml с ключем /Gc обрабатывает функции по Паскалевскому соглашению ml /Gd - Cи соглашение ml /Gz - Stdcall соглашение 2) Можно обойтись без прерываний используя порты. Есть такая программа "UserPort" от Tomas Franzon exe и sys разблокирует обращения к любым портам при работе под Win32. Порты контроллера клавиатуры 060h-06Fh. Фрагмент обработчика прерывания от клавиатуры int 9, которое читает скан-код клавиши, подтверждает факт приема скан-кода, преобразует код в соответствии с переключателями и помещает преобразованный код в буфер клавиатуры Код (Text): in al,60h;читаем скан-код в порт 60h push ax in al,61h;читаем порт 61h or al,80h;старший бит байта из порта 61h в 1 out 61h,al;подтверждаем факт приема скан-кода pop ax out 61h,al;восстановили байт в порту 61h а это фрагмент из программы под WinXP вывод в окошко скан-кода Код (Text): @@WM_CHAR: xor eax,eax in al,60h push eax push offset fmat2;fmat2 db '%02d',0 push offset buffer call _imp__wsprintfA pop ecx pop ecx pop ecx push offset buffer push 1001 push hwnd call _imp__SetDlgItemTextA@12