Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 133
от 11.05.2005, 12:10

Администратор:Калашников О.А.
В номере:Вопросов: 2, Ответов: 3


Вопрос № 20482: У меня вопрос... Я пишу резидент и он должен по зажатой клавише "2" менять текущую видеостраницу. Но почему-то смены не происходить. Помогите - где у меня ошибка. Вот моя процедура: Int_09h_proc proc cli pushf <b...
Вопрос № 20486: Уважаемые эксперты! Имеется файл jpg, нужно изменить размер изображения и качество и записать в другой файл jpg. Как программно это сделать? ...

Вопрос № 20482
У меня вопрос... Я пишу резидент и он должен по зажатой клавише "2" менять текущую видеостраницу. Но почему-то смены не происходить. Помогите - где у меня ошибка.
Вот моя процедура:
Int_09h_proc proc

cli
pushf
call dword ptr cs:[Int_09h_vect]
pusha ;Сохраним регистры в стеке...

in al,60h ;Получим СКАН-КОД нажатой клавиши.
test al,10000000b ;(=80h) Это отпускание клавиши?
jz Exit_09h
mov ah,1 ;Получим ASCII-код нажатой клавиши.
int 16h
jz Exit_09h ;Тогда на выход.
cmp al,02h ;Клавиша 2?
jnz Exit_09h

mov ax,0500h
jmp dword ptr cs:[Int_10h_vect] ;передаем управление
;оригинальному обработчику 10h

Exit_09h:

popa

sti ;Разрешим прерывания и
iret
Int_09h_vect dd ? ;адрес оригинального абработчика
Int_09h_proc endp
Весь текст программы ниже...

Приложение:

Отправлен: 05.05.2005, 12:54
Вопрос задал: edson (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: Ayl
Здравствуйте, edson!
брр... И не произойдет с таким кодом. Давай по порядку:
1. Нафига из обработчика 9-го прерывания вызывать 16-е? Во-первых, это запросто может завесить комп. Во-вторых, оно тебе просто не нужно. У тебя есть скен-код нажатой клавиши. Проверяй его на соответствие скен-коду 2-ки - и все. Или ты не хочешь разбираться с клавишами регистров и дополнительной клавиатурой? Тоже не беда - читай буфер клавы напрямую через область BIOS'а. Но не через прерывание!
Запомни: вызов любого прерывания из аппаратного прерывания (8, 9 и т.д.) - потенциальная причина неработоспособности проги!
2. Допустим, что возможен вызов 16-го прерывания. С чем ты сравниваешь результат? С 2-кой? а почему? В регистре AL находится ASCII-код нажатой клавиши. ASCII 2 соответствует комбинации Ctrl+B (кстати, проверь - может что и случится по этому нажатию). Символ 2 имеет ASCII-код 32h или 50 в 10-й с.с. А если ты хотел проверить скен-код, то все равно не правильно. Во-первых, он находится в регистре AH. Во-вторых, клавише с цифрой 2 соответствует скен-код 3 (1 - Esc, 2 - "1", 3 - "2" и т.д.).
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 05.05.2005, 13:42
Оценка за ответ: 5
Комментарий оценки:
Изменил процедуру -
Int_09h_proc proc

cli
pushf
call dword ptr cs:[Int_09h_vect]
pusha ;Сохраним регистры в стеке...

in al,60h ;Получим СКАН-КОД нажатой клавиши.
mov ah,al
and al,7fh ;al - чистый скан-код без признака нажатия
cmp al,03h ; 2?
jnz Exit_09h
mov ax,0500h
jmp dword ptr cs:[Int_10h_vect] ;передаем управление
;оригинальному обработчику 10h

Exit_09h:

popa

sti ;Разрешим прерывания и
iret
Int_09h_vect dd ? ;адрес оригинального абработчика
Int_09h_proc endp
Но всё равно смены видеостраницы не происходит - пишет, что "процессор обнаружил недопустимую инструкцию...". Интересно чего ему теперь не нравится....

Отвечает: Евгений Иванов
Здравствуйте, edson!
использовать внутри обработчика клавиатурного прерывания прерывание номер 22 - маразм.
и какое ты право ставишь CLI вначале обработчика? не сохранив флаги?
и код 2 - это клавиша F1(её скан-код), а не двойка.
у двойки ascii-код - 32h.
jmp dword ptr cs:[Int_10h_vect] ;передаем управление
;оригинальному обработчику 10h
а это что такое за безобразие?!
это же непозволительно!
восстановить нужно регистры и флаги , а потом уже двигать в другой обработчик!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 07.05.2005, 15:35


Вопрос № 20486
Уважаемые эксперты! Имеется файл jpg, нужно изменить размер изображения и качество и записать в другой файл jpg. Как программно это сделать?
Отправлен: 05.05.2005, 15:39
Вопрос задал: Александр А.А. (статус: Посетитель)
Всего ответов отправлено: 1

Отвечает: John Freeman
Здравствуйте, Александр А.А.!
Любой либ для этого - например libgfl как в PicaView
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 05.05.2005, 15:43


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Посетителей: сейчас / за сутки / всего Яндекс


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться

В избранное