TSR без использования прерываний DOS

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

  1. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Насколько я понял, ты устанавливаешь УЖЕ ИЗ DOS обработчик int 16h копируя свой код в самый последний кусок "обычной" памяти?

    (просто я думал ты делаешь это из MBR).

    Итак, что же может произойти в твоем случае?

    1. Загружается твой код, вектор int 16h перехвачен, int 9h - нет;
    2. Пока не нажата клавиша - прерывания int 9h нет, а прерывания int 16h тем более - ведь оно программное и его вызывает BIOS из обработчика int 9h.
    3. Пусть нажата клавиша. int 9h BIOS получил управление. Вызвал тебя (int 16h). Ты в свою очередь вызвал int 9h :derisive: Т.е. BIOS. Он ничего не подозревая (наверное) вызвал опять тебя ;) Ты опять вызвал проверку ax=abcd.

    Чтобы понять рекурсию надо понять рекурсию ;) Хотя надо смотреть - может быть я ошибаюсь.
     
  2. v_mirgorodsky

    v_mirgorodsky New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    53
    Вообще говоря, int 16h не вызывается из обработчика int 9h. Обработчик int 9h просто складывает скан-коды клавиш в фифо-буффер, а int 16h их оттуда читает. Если мне не изменяет память, то int 16h вообще нельзя вызывать из контекста int 9h.

    А вообще, давно это очень было... Неужели DOS все еще где-то актуален?
     
  3. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Хм, может и верно ;) надо будет посмотреть...
     
  4. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Chingachguk

    Нет. Я устанавливаю обработчик int 16h до загрузки ДОС (прошиваю этот код в FLASH ПЗУ и БИОС, при поиске ПЗУ, находит этот код и передает ему управление. Это происходит до попадания в MBR). И ,теоретически, работать должно также, как и в MBR.

    Я тоже так думал, так, как сначала написал код, похож на тот, что прикреплен выше, но использующий int 27h для того, чтоб стать резидентом. И он работает :).

    А как же без него то :)
     
  5. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Ничего не получается :dntknw:
    Если запускать код уже из загруженного ДОСа, то все прекрасно работает. А из ПЗУшки не хочет. Виснет тогда, когда топится мой обработчик (при перезаписи нового вектора). Там в программе есть одна переменная(segm), в которой содержится адрес сегмента обработчика. Почему в ДОСе его значение сохраняется, а при запуске из ПЗУ нет (место, зарезервированное для переменной тоже находится в отрезанной у ДОС памяти)? Если вместо этой переменной поставить адрес сегмента, то все работает. Но ведь этот адрес не всегда один и тот же (получаю его из 0:[413]).
    Если ошибка не в этом, то подскажите чего не так.
    Вместо 16-го пробовал прерывание таймера и 10 (насчет рекурсии).

    Код (Text):
    1. push 0    
    2. pop  es
    3. sub  word ptr es:[0413h],2
    4. mov  ax,es:[0413h]                    
    5. mov  cl,6                                                        
    6. shl  ax,cl  
    7. mov  segm,ax
    А затем в переменной почему то неправильное значение вектор указывает не на мой обработчик, а неизвестно куда...

    Код (Text):
    1. cli
    2. mov ax, segm
    3. mov ds,ax
    4. mov ax,0h
    5. mov es,ax
    6. mov dx,0000h+(offset int_9 - offset @@ResidentalCode)
    7. mov es:[9h*4],dx
    8. mov es:[9h*4+2],ds
    9. sti
     
  6. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    По идее вот тут:

    Используется регистр DS (который к этому моменту обработчик не настроил - он тот, который пришел из внешнего вызова).

    Позже исчо посмотрю.
     
  7. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Понемногу разбираюсь. Я с самого начала копировал адрес сгмета не по правильному адресу. Нужно било так:

    Код (Text):
    1. push 0    
    2. pop  es
    3. sub  word ptr es:[0413h],2
    4. mov  ax,es:[0413h]                    
    5. mov  cl,6                                                        
    6. shl  ax,cl      
    7. mov  es,ax
    8. mov  es:segm,ax  ;здесь уже правельный адрес
    И еще эти 2 обработчика находятся в одном сегменте, и в cs находится нужный адрес.
    Еще появилось куча интересных глюков. Например, перед выводом символа пищит спикер:). Попробую это выправить