#1 12.03.10 14:49
Ассемблер. Проблема с резидентом
Соббсно такая проблема.
Исходная задача - написать резидент под DOS ...
Все вроде нормально, но обеспечивать резидентность нужно при помощи мультиплексорного прерывания 2FH. И вот тут и возникает проблема - при выгрузке резидента не восстанавливаются старые вектора прерываний. И резидент не выгружается.
З.Ы. На основе мультиплексорного прерывания 2DH все работает.
З.З.Ы. Запускаю прогу под DosBox'ом
Offline
#4 12.03.10 23:56
Re: Ассемблер. Проблема с резидентом
Revenger написал(а):
не восстанавливаются старые вектора прерываний. И резидент не выгружается.
магия какая-то.
Дебажить пробовал?
http://vogons.zetafleet.com/viewtopic.php?t=7323
у DosBox своеобразный метод эмуляции прерываний, хотя всё должно работать.
Offline
#5 13.03.10 00:18
Re: Ассемблер. Проблема с резидентом
$up написал(а):
магия какая-то.
Да я сам в шоке. Уже хз что делать.
Вот кусок кода по выгрузке резидента(кусок нового хендлера прерывания 2FH)
Код::
Proc new_2Fh ; мультиплексное прерывание ..... uninstall: push ds push es push dx mov ax,251Ch ; Восстановим вектор 1Ch lds dx,[cs:old_1Ch] int 21h mov ax,252Fh ; Восстановим вектор 2Fh lds dx,[cs:old_2Fh] int 21h mov ax,2509h ; Восстановим вектор 09h lds dx,[cs:old_09h] int 21h ; Получим из PSP адрес собственного окружения и выгрузим его mov es,[cs:2Ch] ; es <- сегментный адрес окружения программы mov ah,49h ; Функция освобождения блока памяти int 21h ; Выгрузим теперь программу из памяти вместе с PSP push cs pop es ; es снова указывает на начало PSP mov ah,49h ; Функция освобождения блока памяти int 21h pop dx pop es pop ds iret Endp new_2Fh
Offline
#6 02.04.10 14:43
Re: Ассемблер. Проблема с резидентом
Revenger написал(а):
Соббсно такая проблема.
Исходная задача - написать резидент под DOS ...
Все вроде нормально, но обеспечивать резидентность нужно при помощи мультиплексорного прерывания 2FH. И вот тут и возникает проблема - при выгрузке резидента не восстанавливаются старые вектора прерываний. И резидент не выгружается.
З.Ы. На основе мультиплексорного прерывания 2DH все работает.
З.З.Ы. Запускаю прогу под DosBox'ом
А если восстанавливать старые вектора напрямую,
а не через дос?
Offline

