Показать сообщение отдельно

try except endt
  #3  
Старый 12.12.2006, 23:00
hidden
Постоянный
Регистрация: 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.. Причина: Придерживаться формата, относится для всех!
 
Ответить с цитированием