Вопрос № 34800: Здравствуйте уважаемые эксперты!
Помогите разобраться, что к чему. Т. е. мне нужно вызвать прерывание 21h, не на прямую, а через jmp. Для этого я попытался засунуть это прерывание, (точнее его адрес) в метку бокс (box: dd 0) и потом просто туда п...
Вопрос № 34.800
Здравствуйте уважаемые эксперты!
Помогите разобраться, что к чему. Т. е. мне нужно вызвать прерывание 21h, не на прямую, а через jmp. Для этого я попытался засунуть это прерывание, (точнее его адрес) в метку бокс (box: dd 0) и потом просто туда прыгнуть, но у меня не чего не выходит, (недопустимые инструкции). Посмотрите пожалуйста, приложение, и объясните мне, что я делаю не так.
Приложение:
Отправлен: 05.02.2006, 23:28
Вопрос задал: Minigun (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Стас
Здравствуйте, Minigun!
1) вместо jmp используй Call, а то из твоей проги уходишь на int 21 и не возвращаешся...
2) присвой DS = CS
т.е.:
...
mov dx,offset slovo
push cs
pop ds
call dword ptr cs:[box]
int 20h
Ответ отправил: Стас (статус: Специалист)
Отправлен: 06.02.2006, 00:21 Оценка за ответ: 5 Комментарий оценки: Спосибо! Все работает в лучшем виде.
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Minigun!
Небольшое дополнение.
Можно использовать и jmp.
Например в случае, когда пишешь свой обработчик какого-нибудь прерывания
и хочешь отправить на старую отработку. Тогда iret старого вектора вернет
в точку, откуда было вызвано твое прерывание.
new_21h:
cmp ah,9
jne to_old_vector
...
iret
to_old_vector:
jmp dword ptr cs:[old_21h]
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Студент)
Отправлен: 06.02.2006, 10:25 Оценка за ответ: 5 Комментарий оценки: Понял, в моем случе было, что мы прыгали на прерывание, а на зад не возвращались. Теперь я с этим разобрался, спасибо!