Обработчик ошибок - Assembler
Формулировка задачи:
Всем привет!
Наверняка же кто-то уже писал универсальный обработчик ошибок? Типа:
где ShowErrMsg вызывает GetLastError, интерпретирует код ошибки и вызывает MessageBox с кодом ошибки и её расшифровкой - "Error! FILE_NOT_FOUND!".
Может поделитесь?
... invoke function cmp eax, NO_ERROR jne ShowErrMsg ...
Решение задачи: «Обработчик ошибок»
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 $ @@: ; ...
Объяснение кода листинга программы
- Объявлены две переменные: msgBuff типа DWORD и eax, ebx.
- Выполняется команда LOCAL msgBuff:DWORD, которая объявляет переменную msgBuff как локальную с тем же типом DWORD.
- Выполняется команда invoke GetLastError, которая вызывает функцию GetLastError и сохраняет ее возвращаемое значение в eax.
- Выполняется команда or eax,eax, которая устанавливает биты всех слов возвращаемого значения в единицы.
- Если выполнена команда jz @f, то программа переходит к метке @@.
- Выполняется команда mov ebx,eax, которая перемещает значение eax в ebx.
- Выполняется команда invoke FormatMessageA, которая вызывает функцию FormatMessageA. В качестве параметров передаются: FORMAT_MESSAGE_ALLOCATE_BUFFER OR FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_IGNORE_INSERTS (конкатенируемые с помощью оператора OR),0,ebx,0,адрес msgBuff,0,0.
- Выполняется команда invoke MessageBox, которая вызывает функцию MessageBox. В качестве параметров передаются: 0,msgBuff,0,0.
- Выполняется команда invoke LocalFree,msgBuff, которая вызывает функцию LocalFree, передавая в качестве параметра msgBuff.
- Выполняется команда mov eax,-1, которая устанавливает значение eax равным -1.
- Программа переходит к метке @@.
- Выполняется команда ret, которая завершает выполнение функции.
- Выполняется команда invoke function, которая вызывает функцию.
- Выполняется команда invoke ShowMyError, которая вызывает функцию ShowMyError.
- Выполняется команда or eax,eax, которая устанавливает биты всех слов возвращаемого значения в единицы.
- Если выполнена команда jz @f, то программа переходит к метке @@.
- Выполняется команда jmp $, которая переходит к следующей команде в коде.
- Программа переходит к метке @@.
- Код заканчивается.
- В конце кода присутствует ошибка, так как есть команда jmp $, которая не имеет соответствующей команды или метки.