Domanda

Ho avuto qualche problema ultimamente con overflow FPU stack. Sono riuscito a tenere traccia di nuovo a una funzione di libreria buggy che spinge un valore di immondizia sulla FPU pila ogni volta che viene chiamato e non si pulisce.

Per fortuna, questo è facilmente riproducibile e so esattamente quali condizioni provocano. Posso cadere un blocco di ASM in linea nella routine che chiama questa routine per estrarre la parte posteriore del valore superiore dallo stack FPU ... tranne che non so bene cosa scrivere. Il mio ASM-fu è giusto middlin', ma non che forte.

Allora, qual è il modo più semplice per sbarazzarsi del valore in cima alla pila FPU a x86 assemblaggio, ammesso che sia caratteri privi di significato e non mi interessa circa il valore?

È stato utile?

Soluzione

Se sapete quanto è necessario regolare la pila da, è possibile utilizzare fincstp. Anche voi volete ffree i registri che si incrementa nel corso.

Tuttavia, probabilmente la soluzione più semplice è quella di utilizzare una delle operazioni di trasferimento dei 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, salvando i requisiti di memoria:

fstp st(0)

qui per una guida dettagliata sulle istruzioni (in particolare questo bit ).

Altri suggerimenti

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

asm
 fstp st(0)
end;

Se st0 è solo x87 registrare il in uso, è possibile svuotare con:

ffree st0

Ma questo è diverso da un pop normale se ci sono più registri di stack in uso, in quanto esso non regola il puntatore top-of-stack (campo TOP nella parola di stato x87).

capitolo registri del Semplicemente FPU x87 esercitazione .

st1 sarebbe ancora st1 dopo aver liberato st0 invece di popping, quindi questo è di norma non ciò che si vuole e non ha alcun vantaggio significativo rispetto fstp st0.

appena pop dallo stack qualsiasi istruzione (veloce) che si apre. 8087 set di istruzioni

se questo non funziona, FUCOMPP apre due volte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top