Come si fa a provocare un'errore di virgola mobile a 32 bit (comunemente noto come errore di coprocessore [INT 16: 8086]Come si provocano un errore di floating point a 32 bit
risposta
Da Art of Assembly, FPU Control Register
. I bit da zero a cinque sono le maschere di eccezione, che sono simili al bit di abilitazione dell'interrupt nel registro dei flag 80x86. Se questi bit contengono uno, la condizione corrispondente viene ignorata dalla FPU 80x87. Tuttavia, se qualche bit contiene zero, e si verifica una condizione corrispondente, quindi la FPU genera immediatamente un interrupt in modo che il programma possa gestire la condizione di degenerazione
Assicurarsi che il registro di controllo abbia 6 lbsbs deselezionati, quindi produrre una delle condizioni. Dividere per zero è probabilmente il più facile da produrre.
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;
}
Uscita su x64/i5/gcc 4.6/ubuntu
Eccezione di virgola mobile
Disclaimer - Non capisco la parte "in 32 bit". Su 386+ c'è un'eccezione aggiuntiva per over/underflow dello stack. Un underflow dovrebbe essere fattibile chiamando ad es. fdivp quando presumibilmente non ci sono valori nello stack fp. –
Aki, nel tuo commento intendevi 486+? O coprocessori? –
Intendevo 80387 coprocessore. I suoi predecessori non avevano eccezioni di overflow. Ma ancora non ho il requisito per 32-bit. –
Quale situazione ha ispirato a chiedere questo? Le persone come me normalmente si aspettano che le istruzioni a virgola mobile non abbiano effetti a virgola mobile. –