background image

D-14 Vol. 1

GUIDELINES FOR WRITING X87 FPU EXCEPTION HANDLERS

FLDENV [EBP-28]

;DE-ALLOCATE STACK SPACE, RESTORE REGISTERS

MOV ESP, 

EBP

.
.
POP EBP

;
;RETURN TO INTERRUPTED CALCULATION

IRETD
SAVE_ENVIRONMENT ENDP

Example D-5.  Reentrant Exception Handler

.
.

LOCAL_CONTROL DW ?; ASSUME INITIALIZED

.
.

REENTRANTPROC
;
;SAVE REGISTERS, ALLOCATE STACK SPACE FOR x87 FPU STATE IMAGE

PUSH EBP
.
.
MOV EBP, 

ESP

SUB 

ESP, 108  ;ALLOCATES 108 BYTES (32-bit PROTECTED MODE SIZE)

;SAVE STATE, LOAD NEW CONTROL WORD, RESTORE INTERRUPT ENABLE FLAG (IF)

FNSAVE [EBP-108]
FLDCW LOCAL_CONTROL
PUSH 

[EBP + OFFSET_TO_EFLAGS]  ;COPY OLD EFLAGS TO STACK TOP

POPFD ;RESTORE IF TO VALUE BEFORE x87 FPU EXCEPTION

.
.

;
;APPLICATION-DEPENDENT EXCEPTION HANDLING CODE  

;GOES HERE - AN UNMASKED EXCEPTION

;GENERATED HERE WILL CAUSE THE EXCEPTION HANDLER TO BE REENTERED
;IF LOCAL STORAGE IS NEEDED, IT MUST BE ALLOCATED ON THE STACK

.

;CLEAR EXCEPTION FLAGS IN STATUS WORD (WHICH IS IN MEMORY)
;RESTORE MODIFIED STATE IMAGE

MOV 

 BYTE PTR [EBP-104], 0H

FRSTOR  [EBP-108]

;DE-ALLOCATE STACK SPACE, RESTORE REGISTERS

MOV ESP, 

EBP

.
.
POP EBP

;
;RETURN TO POINT OF INTERRUPTION

IRETD
REENTRANT ENDP