2013-04-26 9 views

Antwort

2

Von Art of Assembly, FPU Control Register

. Die Bits 0 bis 5 stellen die Ausnahmemasken dar. Diese ähneln dem Interrupt-Freigabebit im Flags-Register des 80x86.Falls diese Bits eine Eins enthalten, wird die entsprechende Bedingung von der FPU 80x87 ignoriert.Wenn jedoch ein Bit Null enthält, und die Wenn die entsprechende Bedingung eintritt, erzeugt die FPU sofort einen Interrupt, so dass das Programm mit der entarteten Bedingung umgehen kann:

Stellen Sie sicher, dass das Kontrollregister 6 lsbs gelöscht hat, und stellen Sie dann eine der Bedingungen her. Die Division durch Null ist wahrscheinlich am einfachsten zu erzeugen.

int main() 
{ 
    int cw=0; 
    asm("fstcw (%0)\n\t"::"r"(&cw):"memory"); cw &= ~0x3f; 
    asm("fldcw (%0)\n\t"::"r"(&cw):"memory"); 
    asm("fldz"); // divide 1 by 0.0 
    asm("fld1"); // or just omit these two loads if you have 387+ :) 
    asm("fdivp"); 
    asm("wait"); // This is mandatory 
    return 0; 
} 

Ausgabe auf x64/i5/gcc 4.6/ubuntu

Gleitkomma-Ausnahme

+0

Disclaimer - Ich verstehe den Teil "in 32 Bits" nicht. Bei 386+ gibt es jedoch eine zusätzliche Ausnahme für den Stapelüberlauf/-unterlauf. Ein Unterlauf sollte machbar sein, indem z.B. fdivp, wenn im fp-Stack vermutlich keine Werte vorhanden sind. –

+0

Aki, in deinem Kommentar, meinst du 486+? Oder Koprozessoren? –

+0

Ich meinte 80387 Koprozessor. Seine Vorgänger hatten keine Überlauf-Ausnahmen. Aber ich bekomme immer noch nicht die Anforderung für 32-Bit. –