Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 05.09.2007
Сообщений: 7
1

Ошибка при работе с портами

06.01.2008, 17:15. Просмотров 1010. Ответов 6
Метки нет (Все метки)


Следующ.кусок кода определяет нажата клавиша Esc или F8. После компиляции при запуске проги и при нажатии F8 вызывается функция printf произвольное кол-во раз (по идее должно всего один), но
под дебагером printf вызывается один раз. И в Borlande и в Watcome
одинаковый результат
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
while (chz!=1)
{
asm {
mov byte ptr [chz],0
 
in al,060h //читаем код клавиши
mov byte ptr [chz],al
 
//cli обнуляем буфер клавиатуры
xor ax,ax
mov es,ax
mov al,es:[41AH]
mov es:[41CH],al
//sti
}
 
switch (chz){
case 0x42: //здесь собственно глюк
printf( '0x42 UP...
' );
        Up();
break;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2008, 17:15
Ответы с готовыми решениями:

Не является внутренней или внешней командой - ошибка не при компиляции а при работе программы
В VS скомпилировал код #include <iostream> using namespace std; int main() { int a;...

Ошибка при работе с памятью
Если ввести например 6, 0, чтобы выбросить исключение. То по завершение программы выскакивает...

Ошибка при работе со структурами
Вот код. Выдает вот такую вот ошибку "Необработанное исключение по адресу 0x012A58A1 в...

Ошибка при работе с шаблонами
задача: надо создать связанный список . решил посмотреть пример в книге,но там дано код который не...

6
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
06.01.2008, 17:20 2
А ты не думаешь, что у ткебя цикл while крутиться до тех пор пока ты не отпустишь клавишу, а так как нажатие оно всгеда имеет некоторую продолжительность, вот ты и получаешь этот эффект?
Или, по идее, это должно обрабатываться драйвером клавиатуры? Но ты используешь прямое чтение с портов...

С уважением, Владимир
0
0 / 0 / 0
Регистрация: 05.09.2007
Сообщений: 7
06.01.2008, 17:39  [ТС] 3
нет, ты неправ. Даже если перед оператором switch вставить getch()
функц. printf вызывается 2-3 раза
0
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
06.01.2008, 18:08 4
Может дребезг?

Извини, ничем не могу помочь, я с такой проблемой не сталкивался.

Удачи, Владимир
0
ovalroom
16.01.2008, 17:46 5
Ты читаешь прямо из порта, а потом зачем-то очищаешь буфер клавиатуры. Но значение порта-то при этом не изменится! Можешь хоть сто раз писать нули в ячейку памяти 0:41А, но при этом из порта по адресу 0х60 упорно будешь считывать код последней нажатой клавиши. Под дебагером программа будет проходить один раз - и это тоже естественно. Если ты ее будешь проходить по шагам - из порта 0х60 при этом будут считываться значения кода клавиши, которой шагаешь. Обычно дебагеры стараются восстановить все изменения в системе перед тем как передать управление обратно в отлаживаемую программу. Но в данном случае это невозможно - в порт физически нельзя записать что-то софтверно.
0 / 0 / 6
Регистрация: 06.01.2008
Сообщений: 62
17.01.2008, 11:42 6
господа время ДОС прошло - пользуйте апишные функции что бы узнать кто где у вас что нажал.

GetAsyncKeyState, GetKeyboardState, etc

Igor Soukhov, www.rsdn.ru
0
0 / 0 / 0
Регистрация: 05.09.2007
Сообщений: 7
17.01.2008, 17:06  [ТС] 7
апи функции это конечно понятно, и спасибо, что они есть. Но ведь интересно же с портами работать? вопрос:'как это работает, интересует меня с детства'. да и спросить нет греха.

С уважением Артур С.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2008, 17:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Ошибка при работе с классами
Выдаёт ошибки: 1) expected primary-expression before " #include <iostream> #include <iomanip>...

Ошибка при работе с файлами
Необходимо, создать текстовый файл со случайным именем в диапазоне 8 символов, латиница. Вот...

Ошибка при работе с памятью
Написан следующий код: #include "stdafx.h" #include <iostream> #include <stdio.h> #include...

Ошибка при работе со структурами
#include <iostream> #include <cstdlib> using namespace std; typedef struct slist_ { long...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.