Page 1 of 1

Обработка ошибок FPU и SSE

Posted: Sat Oct 07, 2006 12:54 pm
by Serge
Две новые функции

Функция 68, подфункция 15 - установить обработчик ошибок сопроцессора

eax = 68 - номер функции
ebx = 15 - номер подфункции
ecx = адрес обработчика

Возвращаемое значение:
eax - адрес предыдущего обработчика или 0 при первом вызове

Функция 68, подфункция 18 - установить обработчик ошибок SSE

eax = 68 - номер функции
ebx = 18 - номер подфункции
ecx = адрес обработчика

Возвращаемое значение:
eax - адрес предыдущего обработчика или 0 при первом вызове

Если обработчик ошибки не установлен система завершит программу с
соответствующим кодом исключения - 16 для сопроцессора, 19 для SSE.

Примеры обработчиков ошибок.

Code: Select all

align 4
proc fpu_handler
           locals
             fpu_control  dd ?
             fpu_status   dd ?
             fpu_tag      dd ?
             fpu_eip      dd ?
             fpu_cs       dd ?
             fpu_dataptr  dd ?
             fpu_ds       dd ?
           endl

           fnstenv [esp]                   ;сохраним среду сопроцессора
           fnclex                          ;сбросим флаги ошибок
           or word [fpu_control], 0111111b ;замаскируем все исключения
           fldenv [esp]                    ;восстановим среду сопроцессора

           ret                         ;управление возвращается на
                                        ;инструкцию вызвавшую исключение
endp

align 4
proc sse_handler

           mov dword [esp-4], 0x1f80  ;замаскируем все исключения SSE
           ldmxcsr [esp-4]            ;и продолжим выполнение программы
           ret
endp