Вопрос № 172204: Здравствуйте. Есть вопрос, связанный с портами клавиатуры. Ниже приведена небольшая резедентная программа. С помощью прерывания 60h считывается символ из порта, потом он сравнивается с другим символом(в моем случае 2), а далее в зависимости от сравне...
Вопрос № 172204:
Здравствуйте. Есть вопрос, связанный с портами клавиатуры. Ниже приведена небольшая резедентная программа. С помощью прерывания 60h считывается символ из порта, потом он сравнивается с другим символом(в моем случае 2), а далее в зависимости от сравнения идут разные сценарии. Меня интересует именно выделанная часть(насколько я знаю в конце прерывания надо еще дописать "завершение работы" с портом, да и само прерывание кривое), в которой не проиходит сравнение, тоесть в независимости от нажатой клавиши
все идет по 1-му сценарию. В чем заключается моя ошибка? Возможно я просто неправильно оформил резидентную часть?
int09h_handler proc far in al,60h cmp al,32h je short re2 mov ah,2 mov dl,33h int 21h re2: jmp dword ptr cs:old_int09h int09h_handler endp
initialize proc near mov ax,3509h int 21h mov word ptr old_int09h,bx mov word ptr old_int09h+2,es mov ax,2509h mov dx,offset int09h_handler int
21h mov ah,49h mov es,word ptr envseg int 21h mov dx,offset initialize int 27h initialize endp end begin
Отвечает _Ayl_, Студент :
Здравствуйте, Инов Сергей Игоревич.
Во-первых, с помощью команд
Код:
in al, 60h cmp al, 32h je short re2
вы ожидаете нажатия клавиши со скен-кодом 32h. Этот код соответствует клавише M. Если вы хотите отлавливать нажатие клавиши 2, то нужно сравнивать
с числом 3 - это скен-код клавиши 2.
Во-вторых, мне не нравится вызов 21-го прерывания из обработчика. Да, в этот момент прерывания заблокированы, то есть не произойдет повторного вызова, но практика нехорошая. В третьих, где сохранение регистров? Вы прерываете чужую программу. Она и знать не должна о том, что было прерывание! Вы же портите как минимум регистры AX и DL. Вообще-то этот пункт должен быть самым первым: никогда не изменяй регистры в обработчике
аппаратного прерывания!
Насчет завершения прерывания беспокоиться как раз не нужно: вы передаете управление старому обработчику, который, во-первых, подтвердит получение кода из 60-го порта, во-вторых корректно завершит само прерывание.
Приложение:
Ответ отправил: _Ayl_, Студент
Ответ отправлен: 15.09.2009, 18:30
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 254219
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.