Народ, всем приветы, тема довольно избита, в инете море инфы по сабжу, но у меня ну никак не получается освободить память после завершения резидента. Пробовал множество способов: 1. освободить память при помощи mov ah,49h int 21h, предварително в es ставил адрес сегмента резидента - вызов проходит нормально, а памяти после этого не прибавляется - не освобождается (то же самое с 4Ah функцией) 2. Выгpyзкой чеpез MCB. MCB pезидентной пpогpаммы помечается как свободный пyтем занесения в поле Owner 0... ... ; внyтpи обpаботчика ; аппаpатного пpеpывания mov ax,cs ; освобождение памяти: dec ax ; вместо int 21h/ah=49h mov ds,ax ; полyчим свой MCB mov word ptr ds:[1],0 ; этот блок тепеpь свободный ... Пробовал делать это как из обработчика аппаратного прерывания, так и из программы, которая должна выгрузить этого резидента, тоже никак 3. Пробовал сканировать всю память, искать все MCB: ; сканирование памяти ; если резидент найден в памяти, то AX=1, иначе AX=0 ; ES - сегмент, где находится программа scan proc push bx push ds push dx push si ; в si сегмент работающей программы (нерезидентной) mov si, cs ; находим 1-й MCB mov ah, 52h int 21h mov es, es:[bx-2] mov ax, 1 loo: cmp word ptr es:[1], 0 jz pass_MCB push es pop bx inc bx ; проверим, не данный ли это сегмент? cmp si, bx jz pass_MCB mov ds, bx ; *****В ЭТО МЕСТО ПРОГА НИКОГДА У МЕНЯ НЕ ПОПАДАЕТ ; Я НАВЕРНО ГДЕ НАКОСЯЧИЛ... ; проверим, нет ли резидента в сегменте? mov bx, cs:prizn cmp word ptr ds:[6], bx jz _end pass_MCB: ; проверим, не последний ли это блок? cmp byte ptr es:[0], 'M' jz not_last_MCB xor ax, ax jmp short _end not_last_MCB: ; находим адрес заголовка следующего блока mov ax, es inc ax add ax,es:[3] mov es,ax jmp short loo _end: mov bx, es inc bx mov es, bx pop si pop dx pop ds pop bx ret scan endp После этого предполагалось, так же как и во 2-м способе, записат в Owner 0... Не получается 4. Выгpyзка чеpез int 21h/ah=4Ch. ; 1) занести в SDA[10h] PSP выгpyжаемой пpогpаммы mov ax,5D06h ; полyчить адpес SDA int 21h ; (Swappable Data Area) mov ds:[si+10h],es ; пpедполагаю, что PSP ; выгpyжаемой содеpжится в ; es, а выгpyжающей - в cs ; 2) в ее PSP[16h] занести PSP выгpyжающей пpогpаммы mov es:[16h],cs ; 3) в ее PSP[0Ah] - адpес возвpата в выгpyжающyю пpогpаммy mov es:[0Ah],offset Return_Here mov es:[0Ch],cs mov ax,4C00h int 21h Return_Here: ; 4) после вызова int 21h необходимо восстановить все pегистpы ; (оpиентиpоваться можно только по pегистpy cs) push cs cs cs pop ds es ss mov sp,offset _Stack (код не мой, взят из инета) Тоже не работает, как я понял адрес возврата где-то сбивается... И прога вешает систему ЛЮДИ, ПОМОГИТЕ ОСВОБОДИТЬ ПАМЯТЬ!!! Только не надо про мультиплексорное прерывание сказаки... int 2fh или как там его
Видимо из море инфы ты похватал только верхушки 1. Занесения 0 недостаточно для освобождения МСВ. 2. там где возвращаешся через 4с, адрес возврата = ерунда. 3. погугли "AMIS" будет много примеров кода.
_Serega_ AMIS смотрел, чет там путано... Ты с 4Ch знаешь как исправить? Там пункты 1 и 2 правильные, а далее я чет даже и не знаю
я 4с писал сам и у меня работало У тебя возврат идет не в вызывающую прогу, а в текущую... это я и имел ввиду что ерунда.
как это не вызывающую? А в чем разница между текущей и вызывающей? )) Мы же из той проги, на которой данный код выполняется завершаем резидента. Или нет?
адрес возврата в тср нужно передавать в регистре (амис) либо выдирать из стека, если тср выгружается по собственному желанию.
Чёт я механиз до конца не понимаю... Зачем его тср передавать-то? Надо же в ее PSP его записать. Так?
Еще раз: Метка Return_Here: должна находится не в адресном пространстве TSR, а в адресном пространстве parent процесса, т.к. после вызова int 21h ah=4ch память на которую указывает метка не определена и кода там уже нет.