|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.01.2015, 11:46 | #1 |
Изучающий C и ASM
Пользователь
Регистрация: 25.05.2012
Сообщений: 89
|
Установка обработчика прерывания
Всех приветствую! Возник вопрос по старой и давно избитой тематике перехвата прерываний.
Ситуация следующая: ОС нет, есть только утилита, которая шерстит машину, загуженная в память с помощью VBR. Подскажите, пожалуйста, почему следующий код не работает. Вроде бы все правильно написал. Синтаксис FASM Код:
|
11.01.2015, 21:46 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
А регистр DS кто сохранять будет?
Зачем делатся mov [es:si],word 0 при "перехвате" прерывания? SI как бы указывает на смещение обработчика, но на что указывает ES? Вы пытаетесь изменить адрес вектора прерывания или сам код обработчика, а то ни то ни это... Для копирования блока памяти легче использовать LODSB/STOSB вместо MOV/INC. |
12.01.2015, 19:22 | #3 | |
Изучающий C и ASM
Пользователь
Регистрация: 25.05.2012
Сообщений: 89
|
Виноват!
Цитата:
Код:
Код:
|
|
12.01.2015, 20:57 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
jmp в конце должен быть FAR.
Если опять не работает, тогда убирайте все лишнее и возвращайте постепенно и смотрите на каком шаге сломается |
13.01.2015, 14:30 | #5 | |
Изучающий C и ASM
Пользователь
Регистрация: 25.05.2012
Сообщений: 89
|
Цитата:
Код:
UPD: Если убрать упоминание про возврат (db 68 и почие) и поставить в конец не retf, а iret, то все прекрасно работает Последний раз редактировалось Berlioz; 13.01.2015 в 16:44. |
|
13.01.2015, 16:54 | #6 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Из прерываний выходят через iret
|
13.01.2015, 19:12 | #7 |
Изучающий C и ASM
Пользователь
Регистрация: 25.05.2012
Сообщений: 89
|
iret у меня работает. Однако при тестировании под DOS еще надо было учесть, что в памяти "висит" DPMI (с которого запускается FASMD, функция 1678h), соответственно, надо было дальше передать "эстафету". Вот я и пытаюсь понять, где косяк
Может надо было не retf юзать, а опкод jmp far (с другой стороны, в MBR Win7 используется этот трюк)? Я уже вроде все перепробовал. P.S. Сижу уже как истукан |
13.01.2015, 22:47 | #8 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
да, для вызова оригинала надо jmp far, только надо все регистры сохранить, а это может быть проблемой - вам нужен DS или ES чтоб добраться до адреса оригинального обработчика.
Самый простой способ - сохранять адрес прямо в конце обработчика и использовать инструкцию jmp far 0:0 (вместо jmp far [adr]); |
17.01.2015, 20:34 | #9 | |
Изучающий C и ASM
Пользователь
Регистрация: 25.05.2012
Сообщений: 89
|
Цитата:
P.S. Я использовал следующий код, но он тоже не работал. Не могу понять, что опять не так Код:
Последний раз редактировалось Berlioz; 17.01.2015 в 20:43. |
|
17.01.2015, 22:09 | #10 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Ну это надо уже отладчиком смотреть.
Кстати, есть инструкция stosw... |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Замена обработчика прерывания | Berlioz | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 3 | 10.07.2014 15:35 |
Вызов обработчика событий | Alex2009 | Общие вопросы Delphi | 6 | 16.03.2013 16:55 |
Изменение обработчика событий | bogdan333 | C++ Builder | 10 | 29.04.2012 03:25 |
не получается установка обработчика закрытия формы | sergey113 | Помощь студентам | 2 | 14.09.2008 16:00 |