|
|
|
mycodeurnightmare |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 26.10.2014 Репутация: нет Всего: нет |
Доброго времени суток. Вот задание: Реализовать вызов процедуры через системное прерывание для создания нового массива из положительных чисел произвольного массива однобайтных чисел. Входные параметры: адрес исходного массива, его длина, адрес нового массива.
Вот код с процедурой. Но не понимаю теперь как правильно записать адрес собственной процедуры в вектор прерывания. :С Заранее огромное спасибо.
|
|||
|
||||
ФедосеевПавел |
|
|||
Опытный Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: 4 Всего: 10 |
К сожалению, у меня уже нет WinXP, где легко работалось с DOS, и нет виртуальной машины с DOS. Поэтому, подскажу "на словах" в общем виде.
1. Почитайте о прерываниях, о перехвате прерываний, восстановлении исходных векторов. 2. Сделайте перехват 21h прерывания по какой-нибудь неиспользуемой функции (html версия DJDeloriae знаменитого InterruptList от Ralf Brown, или другая версия, даже более удобная) - например 74h. В своём обработчике сделайте проверку - если функция 74h, то вызывайте maspr, иначе отдавайте управление старому обработчику. 3. В программе вызывайте вместо maspr прерывание int 21h fn=74h. 4. Перед завершением программы восстанови исходный обработчик. Чтение вектора прерывания - int 21h fn=35h. Запись вектора прерывания int 21h fn=25h. Внизу представлены примеры. Диспетчер в прерывании 21h - не проверял, но как пример подойдёт. Пример установки новых обработчиков прерываний Ещё пример |
|||
|
||||
mycodeurnightmare |
|
||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 26.10.2014 Репутация: нет Всего: нет |
Спасибо за помощь, но... наверное я что-то совсем не так делаю или не понимаю, как оно работает, ибо резидент не вызывается.
|
||||
|
|||||
ФедосеевПавел |
|
|||
Опытный Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: 4 Всего: 10 |
А это не будет резидентом, просто на время запуска своей программы к некоторым возможностям можно будет обратиться через программное прерывание.
По-моему здесь нужно ASSUME
Кроме того, это код установки прерывания int 69h. Пусть будет 69, но тогда в дальнейшем его и нужно вызывать, а не 21h для вызова maspr. Ещё нужно объявление стека размером хотя бы 1кБайт. Почитай учебники. Мне сложно давать советы без виртуальной машины с DOS. |
|||
|
||||
mycodeurnightmare |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 26.10.2014 Репутация: нет Всего: нет |
Спааасибо Вам огромное, всё заработало.
Это сообщение отредактировал(а) mycodeurnightmare - 20.9.2015, 17:04 |
|||
|
||||
R71MT |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2015 Репутация: нет Всего: 1 |
...процедуры не интересны! Интересно, что вектор потом восстановил!
Это сообщение отредактировал(а) R71MT - 25.9.2015, 20:36 |
|||
|
||||
R71MT |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 28.7.2015 Репутация: нет Всего: 1 |
Можно просто проверить старшую единицу каждого элемента..
На FASM'e это выглядит так (без сохранения/востановления вектора):
|
|||
|
||||
Правила форума "Asm для начинающих" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm для начинающих | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |