Thursday, February 10, 2011

Assembler. Структурная обработка исключений SEH

Windows 95 и Windows NT поддерживают обработку исключений, называемых Структурной Обработкой Исключений, которые обрабатываются операционной системой, но также имеет и прямую поддержку на языке программирования. "Исключение" - случай, который является "неожиданным" или прерывает(останавливает) работу процесса.
Исключения могут быть вызваны как аппаратными средствами ЭВМ, так и программным обеспечением. Вы можете писать более надежный код с использованием Структурной Обработкой Исключений.

Вы можете гарантировать, что ресурсы, типа блоков памяти и файлов, должным образом будут
закрыты в случае неожиданного завершения Вашей программы. Отличительная особенность Структурной Обработки Исключений - это то, что после того, как исключение установлено, можно обращаться к исключению независимо от того, сколько других функций вызываются. Таким образом, функция А может обращаться к исключению, вызывая внутри функцию, называемую A.

Следующий макрос облегчает включение Обработки Исключений в ваши программы. Каждое предложение на ассемблере имеет комментарии, описывающие выполняемое действие.

SEH Macros@TRY_BEGIN  MACRO Handler
  Pushad  ;сохраняем текущее состояние
  Mov esi, offset Handler  ; Адрес нового исключения
  push esi  ; сохраняем старое исключение
  push dword ptr fs: [0]  ;устанавливаем новый Handler
  Mov dword ptr fs: [0], esp
ENDM
@TRY_EXCEPT  MACRO Handler
  Jmp NoException&Handler   ;исключений нет, делаем переход
Handler:   Mov esp, [esp + 8]  ;исключение есть, получаем старое
значение ESP
  pop dword ptr fs: [0]   ;востанавливаем старое исключение
  add esp, 4   ; значение ESP перед тем, как  SEH был установлен
  Popad ; востанавливаем старое состояние
ENDM
@TRY_END MACRO Handler
Jmp ExceptionHandled&Handler   ; исключение было обработано
@TRY_EXCEPT
NoException&Handler:  ;исключений нет
  pop dword ptr fs: [0]   ;востанавливаем старое исключение
  add esp, 32 + 4   ; значение ESP перед тем, как  SEH был установлен
32 для pushad и 4 для смещения Handler  (состояние не восстанавливается)
ExceptionHandled&Handler:
; исключение было обработано, или его вообще небыло
ENDM
Использование SEH Макроса
Вышеописанный макрос используется так:
@TRY_BEGIN HandlerName
 ; Код в этом месте будет проверен на исключения.
@TRY_EXCEPT HandlerName
 ; Код в этом месте будет выполнен, если исключение произойдет.
@TRY_END HandlerName
 ; Нормальное выполнение
Пример программы
Структурная Обработка Исключений на Ассемблере
;
; Чтобы откомпилировать эту программу, Вам потребуется 32 бит.  Turbo
Assembler
;
; TASM32 /ml SEH
; TLINK32 SEH, SEH, , IMPORT32. LIB
.386p
.model flat, stdcall
EXTRN ExitProcess:PROC
EXTRN MessageBoxA:PROC

Read more: Virtual Reality Online