Исключения
При программировании на ассемблере это может быть реализовано простой подменой адреса возврата в стеке. Многие языки высокого уровня (ЯВУ) реализуют те или иные средства для обработки исключений. Уровень этих средств различен в разных языках, начиная от пары функций setjmp и longjmp в С [Керниган-Ритчи 2000] (пример 6.3) и заканчивая операторами try/catch и throw C++ [Страуструп 1999] и Java [Вебер 1999].
Пример 6.3. Исходный текст функций set jmp/ longjmp.
/ setjmp .s (emx+gcc) – Copyright (c) 1990-1996 by Eberhard Mattes # include <emx/asm386.h> .globl _setjmp, _longjmp .text ALIGN # define J_EBX 0 # define J_ESI 4 # define J_EDI 8 #define J_ESP 12 #define J_EBP 16 # define J_EIP 20 # define J_XCP 24 / Слова со смещениями 28.. 44 зарезервированы / int setjmp (jmp_buf here) _setjmp: PROFILE__NOFRAME movl l*4(%esp), %edx /* here */ raovl %ebx, J_EBX(%edx) movl %esi, J_ESI(%edx) movl ledi, J_EDI(%edx) movl %ebp, J_EBP(%edx) movl %esp, J_ESP(%edx) movl 0*4(%esp), %eax /* Адрес возврата */ movl %eax, J_EIP(%edx) cmpb $0, __osmode /* OS/2? */ je If /* No › skip */ fs movl 0, leax /* handler Обработчик исключений */ movl %eax, J_XCP(%edx) 1: xorl %eax, leax EPILOGUE(setjmp) ALIGN / void longjmp (jmp_buf there, int n) _longjmp: PROFILE_NOFRAME cmpb $0, __osmode /* OS/2? */ je 2f /* No › skip */ movl 1*4(%esp), %eax /* there */ pushl J_XCP(%eax) call ___unwind2 /* восстановить обработчики сигналов */ addl $4, %esp 2: movl l*4(%esp), ledx /* there */ movl 2*4(%esp), leax /* n */ testl %eax, leax jne 3f incl %eax 3: movl J_EBX(%edx), %ebx movl J_ESI(ledx), lesi raovl J_EDI(%edx), %edi movl J EBP(%edx), %ebp J_ESP(%edx), J_EIP(%edx >, %edx %edx, 0*4(%espj /* адрес возврата */ EPILOGUE(longjmp) /* well,… */
Исключения в ЯВУ часто позволяют избежать использования нелюбимого структурными программистами оператора goto. В объектно-ориентированных (ОО) языках этот механизм играет еще более важную роль: в большинстве таких языков – это единственный способ сообщить о неудаче при исполнении конструктора объекта.
Важно подчеркнуть, впрочем, что исключения в смысле ЯВУ и аппаратные исключения процессора – разные вещи. В многозадачной ОС пользовательская программа не имеет непосредственного доступа к обработке прерываний и исключений.