Turbo Pascal

Тема в разделе "WASM.BEGINNERS", создана пользователем MayBe, 15 ноя 2006.

  1. MayBe

    MayBe New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2006
    Сообщения:
    12
    Ребят столкнулся с нелепой ситуацией которую никто не может объяснить.
    Кто знаком с Паскалем тот знает что есть такой оператор mem[$xxxx:$xxxx], который возвращает значение байта памяти... Возникла необходимость прочтитать таблицу векторов прерывания с помощью этого оператора, произошла маразматическая ситуация...одна из тех когда готово пошатнуться представление о мире))))
    Он корректно считывает всё, кроме первых восьми байт, первые восемь считывает, выдавая всегда одни и теже числа, но эти числа не соответствуют данным из Dzebug'a d 0:0....
    Помогите разобраться, а то у двоих человек мозг расплавиться.)))
     
  2. CT

    CT New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    72
    Объясню. Ситуация комичная. При запуске дебаг меняет эти первые байты ))) Иначе работать не сможет )))
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. asm
    2. push ds
    3. xor ax,ax
    4. push ax
    5. push ax
    6. pop ds
    7. pop si
    8. lodsw
    9. mov word_0_0,ax
    10. pop ds
    11. end;
    попробуйте так
     
  4. CT

    CT New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    72
    Прерывание 01h на которое указывает соответствующий вектор - отладочное прерывание, вызываемое после КАЖДОЙ инструкции процессора. Дебаг вешает свой обработчик на этот вектор, что позволяет ему пошагово выполнять твой код. Те байты, которые ты видишь под дебагом - вектор его обработчика )))
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    АХРЕНЕТЬ, не знал! :)))

    зы: Почему такие толковые и умные вопросы в новичках?
     
  6. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    хм. разве?
     
  7. CT

    CT New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    72
    Абисняю. С установленным флагом TF процессор генерирует прерывание с номером 1 после выполненной инструкции, после этого сбрасывает флаг TF и таким образом выполняет код обработчика (в данном случае дебаггера) в НЕПОШАГОВОМ режиме. После команды iret флаги восстанавливаются из стека и процессор опять в пошаговом режиме.
     
  8. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    вот именно, TF - важное условие срабатывания int1, а вы его упустили сразу
     
  9. CT

    CT New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    72
    Кстати, есть еще одна особенность дебага (наткнулся еще когда асм изучал, был в шоке)

    Код (Text):
    1. push CX
    2.  
    3. pop CX ; вызванное здесь прерывание затрет отPOPенное значение СХ
    4.  
    5. sub SP,2
    6.  
    7. pop DX
    8.  
    9. cmp DX,CX ; под дебагом они не будут равны! )))
    З.Ы. Прошу прощения за TF ))) Иногда трудно соотнести то, что в голове с тем, что "на бумаге" )))
     
  10. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    это нормальная ситуация за исключением случая, если прерывания запрещены. вместо дебага прерывание в этот момент могли вызвать таймер или клавиатура с тем же эффектом - так нельзя делать в реальной программе.
     
  11. CT

    CT New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    72
    shoo

    Во времена ДОС в реальных программах так ДЕЛАЛОСЬ ))) Вероятность того, что именно в этом промежутке возникнет прерывание - довольно мала, если программу не отлаживают. Что и использовалось вирусами и другим кодом для противостояния отладке. Правда более "продвинутые" отладчики просто переключали стек )
     
  12. MayBe

    MayBe New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2006
    Сообщения:
    12
    Кстати сегодня открыл талмуд Фаронова... абсолютно случайно на станице с ответом почти на мой вопрос, только вопросы остались...
    Дык там сказано что Паскаль для своих нужд при выполнении проги меняет 16 или 18 векторов прерывания на свои... я аж ох*л от такого счастья... только там из первых был int00,int02...так что вопроса не снимало почему первые 8 байт косячит тем более что int02 совпадало с Dzebug'овским...
    Вот в туториале для начинающих автор ссылается на некий толмуд, ребят посоветуйте хорошую книгу чтоб там и про прерывания и про всё и много и в электронном виде)))))
    Ту СТ спасибо... неонатёнок мой уснёт и я попытаюсь всосать, то что ты запостил.))))
    FreeManCPM завтра опробую)
     
  13. CT

    CT New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    72
    MayBe

    Неужели я так мутно изъясняюсь? Мне надо с собой бороться....

    А насчет того, чтобы почитать... ОДНОЗНАЧНО - Питер Абель. Assembler - язык и программирование для IBM PC. Более доходчивого изложения я не встречал.
     
  14. MayBe

    MayBe New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2006
    Сообщения:
    12
    Ок. Всё понятно объяснил у меня ребёнок клавиатуру отбирает))) и мышь пинает...
    Абель хорош, но я его волнами читаю.... причём хаотичными...
    Я так подозреваю, что узнать истинное значение векторов можно только откопав их в BIOS'е в том месте откуда они первоначально грузятся...
    И просматривая Дамп понял что Винда половину векторов если не больше под себя точит...куева хуча одинаковых векторов))))
     
  15. CT

    CT New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    72
    MayBe
    В защищенном режиме, в коем работает винда, таблица векторов прерываний располагается не в начале оперативной памяти, а в так называемой IDT (Interrupt Descriptor Table), физический адрес которой находится в регистре IDTR.... в одном посте все сразу не объяснишь... адресация памяти, вычисление адресов обработчиков и еще_много_чего зависит от режима, в котором в данный момент находится процессор. Турбо Паскаль компилирует программы для реального режима, правила которого к винде не применимы )
     
  16. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    так как ты пишешь под ДОС, то возьми исходники ДОСа :)