Обработчик ошибок - Assembler

Узнай цену своей работы

Формулировка задачи:

Всем привет! Наверняка же кто-то уже писал универсальный обработчик ошибок? Типа:
...
invoke function
cmp eax, NO_ERROR
jne ShowErrMsg
...
где ShowErrMsg вызывает GetLastError, интерпретирует код ошибки и вызывает MessageBox с кодом ошибки и её расшифровкой - "Error! FILE_NOT_FOUND!". Может поделитесь?

Решение задачи: «Обработчик ошибок»

textual
Листинг программы
; ...
ShowMyError proc uses eax ebx
 
    LOCAL msgBuff:DWORD
    invoke GetLastError
    or eax,eax
    jz @f
        mov ebx,eax
        invoke FormatMessageA,FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS,0,ebx,0,addr msgBuff,0,0
        invoke MessageBox,0,msgBuff,0,0
        invoke LocalFree,msgBuff
        mov eax,-1
    @@:
    ret
    
ShowMyError endp
; ...
invoke function
invoke ShowMyError
or eax,eax
jz @f
 jmp $
@@:
; ...

Объяснение кода листинга программы

  1. Объявлены две переменные: msgBuff типа DWORD и eax, ebx.
  2. Выполняется команда LOCAL msgBuff:DWORD, которая объявляет переменную msgBuff как локальную с тем же типом DWORD.
  3. Выполняется команда invoke GetLastError, которая вызывает функцию GetLastError и сохраняет ее возвращаемое значение в eax.
  4. Выполняется команда or eax,eax, которая устанавливает биты всех слов возвращаемого значения в единицы.
  5. Если выполнена команда jz @f, то программа переходит к метке @@.
  6. Выполняется команда mov ebx,eax, которая перемещает значение eax в ebx.
  7. Выполняется команда invoke FormatMessageA, которая вызывает функцию FormatMessageA. В качестве параметров передаются: FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS (конкатенируемые с помощью оператора OR),0,ebx,0,адрес msgBuff,0,0.
  8. Выполняется команда invoke MessageBox, которая вызывает функцию MessageBox. В качестве параметров передаются: 0,msgBuff,0,0.
  9. Выполняется команда invoke LocalFree,msgBuff, которая вызывает функцию LocalFree, передавая в качестве параметра msgBuff.
  10. Выполняется команда mov eax,-1, которая устанавливает значение eax равным -1.
  11. Программа переходит к метке @@.
  12. Выполняется команда ret, которая завершает выполнение функции.
  13. Выполняется команда invoke function, которая вызывает функцию.
  14. Выполняется команда invoke ShowMyError, которая вызывает функцию ShowMyError.
  15. Выполняется команда or eax,eax, которая устанавливает биты всех слов возвращаемого значения в единицы.
  16. Если выполнена команда jz @f, то программа переходит к метке @@.
  17. Выполняется команда jmp $, которая переходит к следующей команде в коде.
  18. Программа переходит к метке @@.
  19. Код заканчивается.
  20. В конце кода присутствует ошибка, так как есть команда jmp $, которая не имеет соответствующей команды или метки.

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы