
12.12.2006, 23:00
|
|
Постоянный
Регистрация: 23.04.2006
Сообщений: 622
С нами:
10552646
Репутация:
1292
|
|
try except endt
Алгоритм: try except endt
Синтаксис: fasm
Описание: Обработка исключений в fasm
Коментарий: При переходе с делфи на ассемблер мне очень нехватало обработки исключений, вот я её и сделал, по образу и подобию стандартного макроса if else endif.
Пример вызова:
Код:
format PE GUI 4.0
entry start
include 'win32w.inc'
data import
library USER32,'USER32.DLL'
import USER32,MessageBoxA,'MessageBoxA'
end data
include 'try.inc'
proc start
try
try
try
push eax
push eax
push eax
xor eax, eax
push eax
push eax
push eax
push dword[eax]
except
invoke MessageBoxA, 0, err2, err2, 0
endt
int3
endt
int3
except
invoke MessageBoxA, 0, err1, err1, 0
endt
ret
endp
TryProc
err1 db 'Error in block 1',0
err2 db 'Error in block 2',0
Код:
Код:
include 'macro/proc32.inc'
macro SetHandler
{ push TryHandler
push dword[fs:0]
mov [fs:0], esp
push __EXCEPT
push ebp }
macro UnsetHandler
{ pop dword[fs:0]
add esp, 4 }
macro try
{ __TRY equ
local ..endt
__ENDT equ ..endt
local ..except
__EXCEPT equ ..except
SetHandler }
macro except
{ add esp, 8
UnsetHandler
jmp __ENDT
__EXCEPT:
UnsetHandler
restore __TRY
__TRY equ , }
macro endt
{ if __TRY eq
add esp, 8
__EXCEPT:
UnsetHandler
end if
__ENDT:
restore __EXCEPT
restore __ENDT
restore __TRY }
macro TryProc
{ proc TryHandler, ExceptionRecord, EstablisherFrame, ContextRecord, DispatcherContext
push esi edi ebx
mov esi, [EstablisherFrame]
mov edi, [ContextRecord]
mov ebx, esi
sub esi, 8
add edi, $B4
movsd ; ebp
lodsd
xchg [edi], eax
;movsd ; eip
mov [edi+12], ebx ; esp
mov [edi-8], eax ; esp
pop ebx edi esi
xor eax, eax
ret
endp }
if noinit eq
else
TryProc
end if
*Сделаны исправления
Последний раз редактировалось hidden; 05.03.2007 в 18:31..
Причина: Придерживаться формата, относится для всех!
|
|
|