Выгрузка TSR из памяти

Тема в разделе "WASM.ASSEMBLER", создана пользователем gloomyraven, 5 ноя 2006.

  1. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Народ, всем приветы, тема довольно избита, в инете море инфы по сабжу, но у меня ну никак не получается освободить память после завершения резидента.

    Пробовал множество способов:
    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ь свободный
    ...
    Пробовал делать это как из обработчика аппаратного прерывания, так и из программы, которая должна выгрузить этого резидента, тоже никак :dntknw:



    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...
    Не получается :dntknw:

    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
    (код не мой, взят из инета) Тоже не работает, как я понял адрес возврата где-то сбивается... И прога вешает систему :dntknw:

    ЛЮДИ, ПОМОГИТЕ ОСВОБОДИТЬ ПАМЯТЬ!!!
    Только не надо про мультиплексорное прерывание сказаки... int 2fh или как там его :)
     
  2. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Видимо из море инфы ты похватал только верхушки :)
    1. Занесения 0 недостаточно для освобождения МСВ.
    2. там где возвращаешся через 4с, адрес возврата = ерунда.
    3. погугли "AMIS" будет много примеров кода.
     
  3. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    _Serega_
    AMIS смотрел, чет там путано... Ты с 4Ch знаешь как исправить? Там пункты 1 и 2 правильные, а далее я чет даже и не знаю
     
  4. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    я 4с писал сам и у меня работало:)
    У тебя возврат идет не в вызывающую прогу, а в текущую... это я и имел ввиду что ерунда.
     
  5. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    как это не вызывающую? А в чем разница между текущей и вызывающей? :))) Мы же из той проги, на которой данный код выполняется завершаем резидента. Или нет?
     
  6. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    нет!!! cs другой.
     
  7. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    дак подскажи, если знаешь как... :)
     
  8. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    адрес возврата в тср нужно передавать в регистре (амис) либо выдирать из стека, если тср выгружается по собственному желанию.
     
  9. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Чёт я механиз до конца не понимаю... Зачем его тср передавать-то? Надо же в ее PSP его записать. Так?
     
  10. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Еще раз: Метка Return_Here: должна находится не в адресном пространстве TSR, а в адресном пространстве parent процесса, т.к. после вызова int 21h ah=4ch память на которую указывает метка не определена и кода там уже нет.
     
  11. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Спасибо, буду ковырять..