Функция 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