Перехват прерываний, без прерываний :)

Тема в разделе "WASM.ASSEMBLER", создана пользователем spa, 21 фев 2007.

  1. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Код (Text):
    1. inter:
    2.          pusha
    3.          push ds
    4.          xor   cx,cx
    5.          mov   ds,cx
    6.          pushf
    7.          call far [ds:bx]
    8.          pop ds
    9.          popa
    10.          ret
    мой сокращенный вариант но cx номер прирывания умноженный на 4
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Вместо popa/ret просто iret можно юзать
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да ладно?
    мне казалось, что iret вынимает адрес возврата и флаги, а не все регистры подряд.

    умножать на 4 можно значительно проще - shl REGISTER,2
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Нельзя.
    popa восстанавливает 16 регистров общего назначения из стека
    ret озвращает управлению по адресу в стеке

    iret передаёт управление по адресу из стека и восстанавливает регистр флагов.
    Аналог: retf+popf - только писать так ясное дело нельзя.
    Что общего?

    По поводу кода.
    Код (Text):
    1. inter:
    2.          push ds
    3.          push bx
    4.          xor  bx,bx
    5.          mov  ds,bx
    6.          shl  cx,02h
    7.          mov  bx,cx
    8.          pushf
    9.          call far ds:[bx]
    10.          pop  bx
    11.          pop  ds
    12.          ret
    А вообще надо по скорости или по размеру оптимизировать?
    И на степени двойки умножать не надо - их сдвигами заменяют.
    Умножение медленная операция.