2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Доступ к портам ввода-вывода в Windows [asm]
Сообщение11.12.2009, 15:57 


06/10/09
63
Здравствуйте!

Мучает вопрос: КАК? обращаться к портам ввода-вывода, чтоб программа нормально работала!
Я уже перепробовал все способы, которые знаю: использование системных прерываний, средства DOS, BIOS, прямое обращение к памяти, использование портов... Ничего у меня не работает=(
Вот к примеру элементарная строчка:
Код:
        in        al, 60h

Которая возвращает нужный мне скан-код клавиши! Без этой команды программа выдает нормальный результат, а с ней даже запускаться не хочет!
Бьюсь лбом об клавиатуру уже 5-ый день, но ответа найти не могу ни в пособиях, ни в интернете, может кто подскажет, в чем проблема?

 Профиль  
                  
 
 Re: Непонятки с ассемблером
Сообщение11.12.2009, 17:08 
Заслуженный участник


09/08/09
3438
С.Петербург
Что за программа? В какой среде работает (DOS, Windows, Linux)? Каким ассемблером пользуетесь?
Что значит "даже запускаться не хочет"?

Qx15(RUS) в сообщении #270252 писал(а):
Бьюсь лбом об клавиатуру уже 5-ый день
Это не самый рациональный способ отладки.
Фроловых читали http://frolov-lib.ru/books/bsp/v02/index.html ?

 Профиль  
                  
 
 Re: Непонятки с ассемблером
Сообщение11.12.2009, 17:43 


06/10/09
63
Я использую среду MASM32. Проги написаны под виндовс. Вот к примеру простая программа, которая считывает байты из массива inbyte, конвертирует их в биты, делает отступы и записывает все это дело в массив outbit. Затем выводит его через MessageBox:
Код:
.686
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

        .data
        MsgCaption  db  "Сообщение", 0
        inbyte  db  1h, 2h, 3h, 4h, 5h, 6h, 7h, 8h, 0
        outbit  db  100h dup(0h), 0
        inend   dd  ?, 0

        .code
start:  lea     ecx, outbit
        dec     ecx   
        mov     inend, ecx
        inc     ecx
        lea     ebx, inbyte
loc_1:  mov     dl, 0h
        mov     al, [ebx]
loc_2:  mov     dh, 0h
        bt      ax, dx
        rcl     dh, 1h
        add     dh, 30h
        mov     [ecx], dh
        inc     dl
        inc     ecx
        cmp     dl, 7h
        jb      loc_2
        mov     al, 0Dh
        mov     [ecx], al
        inc     ecx
        inc     ebx
        cmp     ebx, inend
        jb      loc_1
        invoke  MessageBox, NULL,addr outbit, addr MsgCaption, MB_OK
        invoke  ExitProcess,NULL
        end     start

А вот теперь я хочу организовать ввод элементов с клавы. После стартовой метки вставил:
Код:
start:  in      al, 60h

(Если показать кусок листинга получилось)
Код:
...
        .code
start:  in      al, 60h
        lea     ecx, outbit
...

Откомпилировал, запустил .exe файл (не консольный!) И .... ничего.. MsgBox с нужным сообщением не вывелся, как было до вставки=(
При запуске показалась смена курсора на песочные часики и обратно... Мое приложение не числиться среди исполняемых, пробовал потыркать кнопочки после "запуска" (может там ожидание изменений), но вывода окошка тоже не последовало.
Может неправильно применил команду "in", или не ввел конструкций типа
"xor ax, ax"? Подскажите в чем проблема.

 Профиль  
                  
 
 Re: Непонятки с ассемблером
Сообщение11.12.2009, 17:47 
Заслуженный участник


04/05/09
4587
А почему вы решили, что под Windows будут работать низкоуровневые операции с портами?
Наверняка порты клавиатуры напрямую доступны только драйверам, и сомневаюсь, что они сэмулированы для DOS бокса.

 Профиль  
                  
 
 Re: Непонятки с ассемблером
Сообщение11.12.2009, 17:48 


06/10/09
63
Извините за тупой вопрос=) Как записать в eax, скан-код нажатой мною клавиши? Можете выложить конструкцию?

-- Пт дек 11, 2009 17:51:33 --

Почему я так решил? Наверное потому, что я полный zero (в смысле ноль) в Ассемблере=) И знаком с ним...6 дней.
Объясните "чайнику", как ввести данные с клавиатуры?

 Профиль  
                  
 
 Re: Непонятки с ассемблером
Сообщение11.12.2009, 18:02 
Заслуженный участник


09/08/09
3438
С.Петербург
Для программы, сделанной под Widows, порты ввода-вывода клавиатуры недоступны: Windows перехватывает все клавиатурные прерывания и формирует сообщения WM_CHAR, WM_KEYDOWN, WM_KEYUP и т.п. Поэтому, если Вы хотите работать с клавиатурой из программы для Windows, надо организовывать цикл обработки сообщений и эти сообщения обрабатывать.
С клавиатурой можно играть в программе, сделанной под DOS, но в ней, естественно, недоступны функции Windows-API MessageBox и ExitProcess. Досовские программы под Windows нормально запускаются (для них создаётся виртуальная DOS-машина), но сначала всё-таки лучше почитать Фроловых (ссылка выше).

-- Пт дек 11, 2009 18:06:13 --

Qx15(RUS) в сообщении #270304 писал(а):
Объясните "чайнику", как ввести данные с клавиатуры?
И в третий раз повторю: уж если Вы решили заняться таким экзотическим делом, то сначала книгу почитайте.

 Профиль  
                  
 
 Re: Непонятки с ассемблером
Сообщение11.12.2009, 18:20 


06/10/09
63
Пример укороченной проги, использующей средства BIOS для работы с клавиатурой:

Код:
.686
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

        .data
        MsgCaption  db  "Окно", 0
        MsgText  dw  ?, 0

        .code
start:  mov     ah, 0h
        int     16h
        mov     MsgText, ax
        invoke  MessageBox, NULL,addr MsgText, addr MsgCaption, MB_OK
        invoke  ExitProcess,NULL
        end     start

"Окно" не выводиться=( Почему? Windows и к BIOS запрещает обращаться?

Цитата:
Для программы, сделанной под Windows

А как сделать прогу не под Windows? И чтоб она, как результат выдала включение светодиодов на клаве?
Цитата:
С клавиатурой можно играть в программе, сделанной под DOS

В досе возможности кастрированные=(

-- Пт дек 11, 2009 18:23:44 --

Цитата:
И в третий раз повторю: уж если Вы решили заняться таким экзотическим делом, то сначала книгу почитайте.


Да прочитал я уже литературы по поводу клавиатуры...и примеры для обращения к ней попеределал...вот только результата нет=(

 Профиль  
                  
 
 Re: Непонятки с ассемблером
Сообщение11.12.2009, 19:34 
Заслуженный участник


09/08/09
3438
С.Петербург
Qx15(RUS) в сообщении #270321 писал(а):
В досе возможности кастрированные=(
Ну Вы уж определитесь, что Вам важнее: некастрированные возможности Windows или поддержка прямых операций с портами ввода-вывода.
Кстати, под Windows тоже можно мигать индикаторами на клавиатуре (GetKeyboardState/SetKeyboardState).

 Профиль  
                  
 
 Re: Непонятки с ассемблером
Сообщение11.12.2009, 19:56 
Заслуженный участник


04/05/09
4587
Windows скрывает детали реализации клавиатуры и даёт доступ к обработанным нажатиям на кнопки. Поэтому вы, например, можете работать с радио-клавиатурой, как с обычной, хотя общение с радио-клавиатурой идёт совсем через другие порты. Сведением разнообразных устройств к единообразному API занимаются драйверы.

До некоторой степени Windows может эмулировать DOS машину, но в этом режиме вам недоступны не-DOS функции типа MessageBox и ExitProcess. Да и DOS машина не до конца сэмулирована. Например чтение с клавиатуры через BIOS, скорее всего, есть, а вот через порты - уже нет.

 Профиль  
                  
 
 Re: Непонятки с ассемблером
Сообщение12.12.2009, 22:17 


11/12/09
25
Вам нужно указать модель памяти tiny, тогда вы переключитесь в 16 разрядный режим. Если же Вы хотите использовать 32 разряда и перехватывать скан коды клавиш, то вам нужно писать хук. Если хотите, могу поделиться исходником под С++ Builder.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group