Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2011, 21:39   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
Вопрос SEH

Здравствуйте, подскажите, пожалуйста, какие части кода эквивалентны try, catch, finally

как я понял, этот кусок эквивалентен catch
Код:
SEHHandler proc uses edx pExcept:DWORD, pFrame:DWORD, pContext:DWORD, pDispatch:DWORD
 
        mov edx,pFrame
        assume edx:ptr SEH
        mov eax,pContext
        assume eax:ptr CONTEXT
        push [edx].SafeOffset
        pop [eax].regEip
        push [edx].PrevEsp
        pop [eax].regEsp
        push [edx].PrevEbp
        pop [eax].regEbp
        mov ValidPE, FALSE
        mov eax,ExceptionContinueExecution
        ret
 
SEHHandler endp

этот finally
Код:
FinalExit:
                                        .if ValidPE==TRUE
                                                invoke MessageBox, 0, addr FileValidPE,\
                                                        addr AppName, MB_OK+MB_ICONINFORMATION
                                        .else
                                                invoke MessageBox, 0, addr FileInValidPE,\
                                                        addr AppName, MB_OK+MB_ICONINFORMATION
                                        .endif
                                        push seh.PrevLink
                                        pop fs:[0]
                                        invoke UnmapViewOfFile, pMapping
                                .else
                                        invoke MessageBox, 0, addr FileMappingError,\
                                                addr AppName, MB_OK+MB_ICONERROR
                                .endif
                                invoke CloseHandle,hMapping
                        .else
                                invoke MessageBox, 0, addr FileOpenMappingError,\
                                        addr AppName, MB_OK+MB_ICONERROR
                        .endif
                        invoke CloseHandle, hFile
                .else
                        invoke MessageBox, 0, addr FileOpenError, addr AppName,
                                MB_OK+MB_ICONERROR
                .endif
        .endif
        invoke ExitProcess, 0
 
start endp

ну а этот try

Код:
        mov pMapping,eax
                                        assume fs:nothing
                                        push fs:[0]
                                        pop seh.PrevLink
                                        mov seh.CurrentHandler,offset SEHHandler
                                        mov seh.SafeOffset,offset FinalExit
                                        lea eax,seh
                                        mov fs:[0], eax
                                        mov seh.PrevEsp,esp
                                        mov seh.PrevEbp,ebp
                                        mov edi, pMapping
                                        assume edi:ptr IMAGE_DOS_HEADER
                                        .if [edi].e_magic==IMAGE_DOS_SIGNATURE
                                                add edi, [edi].e_lfanew
                                                assume edi:ptr IMAGE_NT_HEADERS
                                                .if [edi].Signature==IMAGE_NT_SIGNATURE
                                                        mov ValidPE, TRUE
                                                .else
                                                        mov ValidPE, FALSE
                                                .endif
                                        .else
                                                mov ValidPE,FALSE
                                        .endif

Только вот одно непонятно. С началом try вроде понятно.
Код:
assume fs:nothing
                                        push fs:[0]
эти строки кода указывают на начало. Только вот непонятно с концом. Как компилятор понимает где конец try? Или просто за концом try должен сразу следовать блок finally??????????
Вложения
Тип файла: txt temp.txt (3.5 Кб, 116 просмотров)
Dimarik вне форума Ответить с цитированием
Старый 07.09.2011, 21:44   #2
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

И ещё хотел спросить. зачем эти строки. они же дублируют друг друга О_о
или нет?О_о
Код:
                                        mov edi, pMapping
                                        assume edi:ptr IMAGE_DOS_HEADER

Последний раз редактировалось Dimarik; 07.09.2011 в 21:48.
Dimarik вне форума Ответить с цитированием
Старый 07.09.2011, 23:50   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
или нет?О_о
и давно перемещение данных и сопоставление регистра с адресом структуры одно и тоже?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.09.2011, 23:59   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Не дублируют. Первое - занесение значения в регистр, второе - директива ассемблера, которая какбы говорит ему, на что теперь показывает регистр.
Son Of Pain вне форума Ответить с цитированием
Старый 08.09.2011, 10:37   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

спасибо. Подскажите, пожалуйста,
как я понял,, этот кусок кода эквивалетен catch
Код:
SEHHandler proc uses edx pExcept:DWORD, pFrame:DWORD, pContext:DWORD, pDispatch:DWORD

	mov edx,pFrame
	assume edx:ptr SEH
	mov eax,pContext
	assume eax:ptr CONTEXT
	push [edx].SafeOffset
	pop [eax].regEip
	push [edx].PrevEsp
	pop [eax].regEsp
	push [edx].PrevEbp
	pop [eax].regEbp
	mov ValidPE, FALSE
	mov eax,ExceptionContinueExecution
	ret

SEHHandler endp
только что туда поступает в роли аргументов?
Dimarik вне форума Ответить с цитированием
Старый 09.09.2011, 00:42   #6
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Этот кусок не эквивалентен catch. В обработке seh его заменяет блок _except. А приведенный фрагмент, собственно, является тем обработчиком, который вызывается при возникновении исключения.

Принимает он 4 параметра:
1) указатель на структуру EXCEPTION_RECORD с описанием исключения ( http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx );
2) Указатель на установочный фрейм для этого обработчика (т. е. то, что записывали в fs:[0]);
3) Указатель на структуру CONTEXT ( http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx ), содержащую значения регистров в момент возникновения исключения;
4) Пользовательский параметр.
Son Of Pain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SEH исключения eracer Общие вопросы C/C++ 0 18.11.2009 20:32