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