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
закрыты в случае неожиданного завершения Вашей программы. Отличительная особенность Структурной Обработки Исключений - это то, что после того, как исключение установлено, можно обращаться к исключению независимо от того, сколько других функций вызываются. Таким образом, функция А может обращаться к исключению, вызывая внутри функцию, называемую 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
0 comments:
Post a Comment