Опять TSR…

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

  1. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Может кто подскажет, почему обработчик int10h корректно работает в обычной DOS программе (если обработчик оставлять при помощи int 27h), а если подменить значение в таблице векторов на участок памяти, в который ранее был с копирован обработчик, символы отображаются не правильно. Битовая матрица каждого символа почему то смещена на 11h, а при переключении в графический режим, например, все виснет.
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Там вроде бы есть неточности. Раз смещение символов немного "не то", то значит команды вида:

    mov bp,OFFSET fon16_ascii0

    Указывают не настоящее смещение. Раз код перемещаемый, то по-идее, сначала нужно вычислить базу:

    call @GetOfs
    @@NewOfs:
    pop bx
    sub bx,offset @@NewOfs-offset begin

    И далее отщелкивать от него реальное смещение:

    lea bp,[bx+(offset fon16_ascii0 - offset begin)]

    Ну или как-то так (писал небрежно). Еще меня смутило что:

    1) Там есть кусок где сохраняются все регистры - вроде бы не во всех вариантах они восстанавливаются? Также лучше использовать pusha вместо перечисления push ax..

    2) Зачем делать call far call_int_10h?
    Подпрограмма находится в том же сегменте.

    ж-)
     
  3. lukash

    lukash New Member

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

    Со смещением разобрался. Спасибо за помощь.