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