2011-01-23 12 views
8

Últimamente he tenido algunos problemas con los desbordamientos de pila FPU. Me las arreglé para rastrearlo a una función de biblioteca con errores que empuja un valor de basura en la pila de FPU cada vez que se llama y nunca lo limpia.Manera más simple de eliminar algo de la pila de FPU

Afortunadamente, esto es fácilmente reproducible y sé exactamente qué condiciones lo causan. Puedo colocar un bloque de ASM en línea en la rutina que llama a esta rutina para recuperar el valor superior de la pila de FPU ... excepto que no sé exactamente qué escribir. Mi ASM-fu es justo a middlin ', pero no que fuerte.

Entonces, ¿cuál es la forma más simple de deshacerse del valor superior en la pila FPU en el ensamblaje x86, suponiendo que son datos basura y no me importa el valor?

Respuesta

5

Si sabe cuánto necesita ajustar la pila, puede usar fincstp. También quiere ffree los registros que incremente.

Sin embargo, probablemente la solución más simple es utilizar una de las operaciones de transferencia de datos popping como fstp. Lo normal es que almacenar el resultado en un área de memoria para su uso posterior, algo así como:

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

Pero, si usted sabe lo que desea es tirar el valor, puede utilizar st(0) como el destino, el ahorro de la requisito de memoria:

fstp st(0) 

Ver here para una guía detallada sobre las instrucciones (en particular this bit).

+0

Derecho eres, @Shaggieh, maldito estos gordos dedos míos. Fijo. – paxdiablo

+0

Eso funcionó. ¡Gracias! –

+0

@Shaggieh: sí, pero equivocarse dos veces en la misma respuesta es simplemente ser descuidado :-) Solucionado una vez más. Aclamaciones. – paxdiablo

0

simplemente sáquelo de la pila con cualquier instrucción (rápida) que aparezca. 8087 instruction set

si eso no funciona, FUCOMPP aparece dos veces.

2

si es sólo el valor superior que desea deshacerse de:

ffree st0 
13

para Delphi/BASM, en mi opinión, la forma más sencilla de hacer estallar la pila FPU vez es:

asm 
fstp st(0) 
end; 
+4

Esta es en realidad la respuesta correcta. La mayoría de las implementaciones de x87 están optimizadas para este caso y ni siquiera realizan la transferencia, solo sacan el valor de la pila. – IneQuation

Cuestiones relacionadas