| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > Реализовать вызов процедуры через системное прерыв |
| Автор: mycodeurnightmare 20.9.2015, 01:54 | ||
| Доброго времени суток. Вот задание: Реализовать вызов процедуры через системное прерывание для создания нового массива из положительных чисел произвольного массива однобайтных чисел. Входные параметры: адрес исходного массива, его длина, адрес нового массива. Вот код с процедурой. Но не понимаю теперь как правильно записать адрес собственной процедуры в вектор прерывания. :С Заранее огромное спасибо.
|
| Автор: ФедосеевПавел 20.9.2015, 11:32 |
| К сожалению, у меня уже нет WinXP, где легко работалось с DOS, и нет виртуальной машины с DOS. Поэтому, подскажу "на словах" в общем виде. 1. Почитайте о прерываниях, о перехвате прерываний, восстановлении исходных векторов. 2. Сделайте перехват 21h прерывания по какой-нибудь неиспользуемой функции (http://www.delorie.com/djgpp/doc/rbinter/ix/21/, или http://www.ctyme.com/intr/int.htm) - например 74h. В своём обработчике сделайте проверку - если функция 74h, то вызывайте maspr, иначе отдавайте управление старому обработчику. 3. В программе вызывайте вместо maspr прерывание int 21h fn=74h. 4. Перед завершением программы восстанови исходный обработчик. Чтение вектора прерывания - int 21h fn=35h. Запись вектора прерывания int 21h fn=25h. Внизу представлены примеры. http://forum.vingrad.ru/topic-331174.html - не проверял, но как пример подойдёт. http://forum.vingrad.ru/topic-341801.html# http://forum.vingrad.ru/topic-100542.html |
| Автор: mycodeurnightmare 20.9.2015, 14:12 | ||||
Спасибо за помощь, но... наверное я что-то совсем не так делаю или не понимаю, как оно работает, ибо резидент не вызывается.
|
| Автор: ФедосеевПавел 20.9.2015, 16:43 | ||
| А это не будет резидентом, просто на время запуска своей программы к некоторым возможностям можно будет обратиться через программное прерывание. По-моему здесь нужно ASSUME
Кроме того, это код установки прерывания int 69h. Пусть будет 69, но тогда в дальнейшем его и нужно вызывать, а не 21h для вызова maspr. Ещё нужно объявление стека размером хотя бы 1кБайт. Почитай учебники. Мне сложно давать советы без виртуальной машины с DOS. |
| Автор: mycodeurnightmare 20.9.2015, 16:57 | ||
Спааасибо Вам огромное, всё заработало.
|
| Автор: R71MT 20.9.2015, 21:08 |
| ...процедуры не интересны! Интересно, что вектор потом восстановил! |
| Автор: R71MT 25.9.2015, 20:39 | ||
| Можно просто проверить старшую единицу каждого элемента.. На FASM'e это выглядит так (без сохранения/востановления вектора):
|