2011-01-23 6 views
8

Ultimamente ho avuto dei problemi con gli overflow dello stack FPU. Sono riuscito a rintracciarlo in una buggy funzione di libreria che spinge un valore spazzatura sullo stack FPU ogni volta che viene chiamato e non lo pulisce mai.Il modo più semplice per rimuovere qualcosa dallo stack FPU

Fortunatamente, questo è facilmente riproducibile e so esattamente quali condizioni lo causano. Posso rilasciare un blocco di ASM in linea nella routine che chiama questa routine per estrarre il valore superiore dallo stack FPU ... eccetto che non so bene cosa scrivere. Il mio ASM-fu è equo a middlin ', ma non quello forte.

Quindi qual è il modo più semplice per sbarazzarsi del valore superiore sullo stack FPU nell'assemblaggio x86, assumendo che si tratti di dati inutili e non mi interessa il valore?

risposta

5

Se si sa quanto è necessario regolare la pila, è possibile utilizzare fincstp. Si desidera anche ffree i registri su cui si esegue l'incremento.

Tuttavia, probabilmente la soluzione più semplice è utilizzare una delle operazioni di trasferimento dati popping come fstp. Normalmente si dovrebbe salvare il risultato in una zona di memoria per un uso successivo, qualcosa come:

mem_area: defs 10   ; ten bytes for 80 bits 
      fstp mem_area ; pop it 

Ma, se si sa che si vuole solo buttare via il valore, è possibile utilizzare st(0) stesso come destinazione, il salvataggio del requisiti di memoria:

fstp st(0) 

Vedere here per una guida dettagliata sulle istruzioni (particolarmente this bit).

+0

destro tu sei, @Shaggieh, dannazione per queste mie dita grasse. Fisso. – paxdiablo

+0

Che ha funzionato. Grazie! –

+0

@Shaggieh: sì, ma sbagliare due volte nella stessa risposta è solo essere incurante :-) Risolto ancora. Saluti. – paxdiablo

0

basta estrarlo dallo stack con qualsiasi istruzione (veloce) visualizzata. 8087 instruction set

se questo non funziona, FUCOMPP appare due volte.

2

Se è solo il valore superiore si vuole sbarazzarsi di:

ffree st0 
13

per Delphi/BASM, a mio avviso, il modo più semplice per estrarre la pila FPU una volta è:

asm 
fstp st(0) 
end; 
+4

Questa è in realtà la risposta corretta. La maggior parte delle implementazioni x87 sono ottimizzate per questo caso e non eseguiranno nemmeno il trasferimento, ma solo il valore dello stack. – IneQuation