Вопрос по прерыванию и операнду call

Тема в разделе "WASM.BEGINNERS", создана пользователем pasa, 2 июн 2007.

  1. pasa

    pasa New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2007
    Сообщения:
    1
    Кто-нибудь может толково ответить в чем различие и сходство прерывания и операнда call?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    int X == pushf/call
     
  3. Skycorner

    Skycorner New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    21
    Если прерывание аппаратное, то должно быть понятно - устройство (например, клавиатура) подает сигнал на линию IRQ, процессор, получив этот сигнал, прерывает выполнение текущей задачи (предварительно запомнив регистр флагов и адрес, по которому находится следующая инструкция, в стеке) и переходит к выполнению обработчика прерывания. В конце обработчика стоит оператор IRET - он дает команду процессору извлечь из стека сохраненный регистр флагов и перейти по адресу, который также был сохр. в стеке.
    Если программное - то все просто: вместо вызова CALL FAR PTR ES:[0103h] можно написать красивое int 10h (это для примеру, адрес вообще-то другой). Когда процессор встречает инструкцию int xx, он сохраняет в стеке рег. флагов, адрес след. инструкции и переходит к обработчику, адрес которой хранится в таблице векторов прерываний, где каждому номеру INT'а соответствует адресс процедуры-обработчика. Так проще. Вообще, вместо записи int 21h можно написать
    Код (Text):
    1. pushf
    2. call far ptr es:[xxxx]
    то есть кроме помещения в стек нужного адреса для возврата (что делает CALL), в стек предварительно помещается регистр флагов (pushf)
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    угу, а в es перед этим надо загрузить данные так же из таблицы векторов
     
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Skycorner
    n0name
    так что в Real Mode int XX не сэмулируешь call-ом
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    можно выполнить шаги 2 3 4 1 5.
    1 5 это как раз call, другое дело что проблемы могут (и будут) появится если cs != IDT[X].Offset