Juego de Instrucciones Del 8087
Juego de Instrucciones Del 8087
Juego de Instrucciones Del 8087
Instrucciones aritméticas
Cuando se usan operandos de memoria con una instrucción aritmética, el mnemotécnico de la instrucción
distingue entre número real y número entero. No se pueden realizar operaciones aritméticas con números
BCD empaquetados en la memoria, por lo que deberá usarse FBLD para cargar dichos números desde la
memoria.
FADD: Hace ST(1) más ST, ajusta el puntero de pila y pone el resultado en ST, por lo que ambos operandos
se destruyen.
FADD mem: Hace ST <- ST + [mem]. En mem deberá haber un número real en punto flotante.
FIADD mem: Hace ST <- ST + [mem]. En mem deberá haber un número entero en complemento a dos.
FADD ST(num), ST: Realiza ST(num) <- ST(num) + ST.
FADD ST, ST(num): Realiza ST <- ST + ST(num).
FADDP ST(num), ST: Realiza ST(num) <- ST(num) + ST y retira el valor de ST de la pila, con lo que ambos
operandos se destruyen.
FSUB: Hace ST(1) menos ST, ajusta el puntero de pila y pone el resultado en ST, por lo que ambos
operandos se destruyen.
FSUB mem: Hace ST <- ST - [mem]. En mem deberá haber un número real en punto flotante.
FISUB mem: Hace ST <- ST - [mem]. En mem deberá haber un número entero en complemento a dos.
FSUB ST(num), ST: Realiza ST(num) <- ST(num) - ST.
FSUB ST, ST(num): Realiza ST <- ST - ST(num).
FSUBP ST(num), ST: Realiza ST(num) <- ST(num) - ST y retira el valor de ST de la pila, con lo que ambos
operandos se destruyen.
FSUBR: Hace ST menos ST(1), ajusta el puntero de pila y pone el resultado en ST, por lo que ambos
operandos se destruyen.
FSUBR mem: Hace ST <- [mem] - ST. En mem deberá haber un número real en punto flotante.
FISUBR mem: Hace ST <- [mem] - ST. En mem deberá haber un número entero en complemento a dos.
FSUBR ST(num), ST: Realiza ST(num) <- ST - ST(num).
FSUBR ST, ST(num): Realiza ST <- ST(num) - ST.
FSUBRP ST(num), ST: Realiza ST(num) <- ST - ST(num) y retira el valor de ST de la pila, con lo que ambos
operandos se destruyen.
FMUL: Multiplicar el valor de ST(1) por ST, ajusta el puntero de pila y pone el resultado en ST, por lo que
ambos operandos se destruyen.
FMUL mem: Hace ST <- ST * [mem]. En mem deberá haber un número real en punto flotante.
FIMUL mem: Hace ST <- ST * [mem]. En mem deberá haber un número entero en complemento a dos.
FMUL ST(num), ST: Realiza ST(num) <- ST(num) * ST.
FMUL ST, ST(num): Realiza ST <- ST * ST(num).
FMULP ST(num), ST: Realiza ST(num) <- ST(num) * ST y retira el valor de ST de la pila, con lo que ambos
operandos se destruyen.
FDIV: Dividir el valor de ST(1) por ST, ajusta el puntero de pila y pone el resultado en ST, por lo que ambos
operandos se destruyen.
FDIV mem: Hace ST <- ST / [mem]. En mem deberá haber un número real en punto flotante.
FIDIV mem: Hace ST <- ST / [mem]. En mem deberá haber un número entero en complemento a dos.
FDIV ST(num), ST: Realiza ST(num) <- ST(num) / ST.
FDIV ST, ST(num): Realiza ST <- ST / ST(num).
FDIVP ST(num), ST: Realiza ST(num) <- ST(num) / ST y retira el valor de ST de la pila, con lo que ambos
operandos se destruyen.
FDIVR: Hace ST dividido ST(1), ajusta el puntero de pila y pone el resultado en ST, por lo que ambos
operandos se destruyen.
FDIVR mem: Hace ST <- [mem] / ST. En mem deberá haber un número real en punto flotante.
FIDIVR mem: Hace ST <- [mem] / ST. En mem deberá haber un número entero en complemento a dos.
FDIVR ST(num), ST: Realiza ST(num) <- ST / ST(num).
FDIVR ST, ST(num): Realiza ST <- ST(num) / ST.
FDIVRP ST(num), ST: Realiza ST(num) <- ST / ST(num) y retira el valor de ST de la pila, con lo que ambos
operandos se destruyen.
FABS: Pone el signo de ST a positivo (valor absoluto).
FCHS: Cambia el signo de ST.
FRNDINT: Redondea ST a un entero.
FSQRT: Reemplaza ST con su raíz cuadrada.
FSCALE: Suma el valor de ST(1) al exponente del valor en ST. Esto efectivamente multiplica ST por dos a
la potencia contenida en ST(1). ST(1) debe ser un número entero.
FPREM: Calcula el resto parcial hallando el módulo de la división de los dos registros de la pila que están el
tope. El valor de ST se divide por el de ST(1). El resto reemplaza el valor de ST. El valor de ST(1) no
cambia. Como esta instrucción realiza sustracciones repetidas, puede tomar mucho tiempo si los
operandos son muy diferentes en magnitud. Esta instrucción se utiliza a veces en funciones
trigonométricas.
FXTRACT: Luego de esta operación, ST contiene el valor de la mantisa original y ST(1) el del exponente.
De esta manera, C3 se escribe sobre el indicador de cero, C2 sobre el de paridad, C0 sobre el de arrastre y C1
sobre un bit indefinido, por lo que no puede utilizarse directamente con saltos condicionales, aunque se puede
utilizar la instrucción TEST para verificar el estado del bit C1 en la memoria o en un registro de la CPU.
Las instrucciones de comparación afectan los indicadores C3, C2 y C0, como se puede ver a continuación.
Instrucciones trascendentales
F2XM1: Realiza ST <- 2 ^ ST - 1. El valor previo de ST debe estar entre 0 y 0,5.
FYL2X: Calcula ST(1) * log(2) ST. El puntero de pila se actualiza y luego se deja el resultado en ST, por lo
que ambos operandos se destruyen.
FYL2XP1: Calcula ST(1) * log(2) (ST + 1). El puntero de pila se actualiza y luego se deja el resultado en ST,
por lo que ambos operandos se destruyen. El valor absoluto del valor previo de ST debe estar entre 0 y
la raíz cuadrada de 2 dividido 2. FPTAN: Calcula la tangente del valor en ST. El resultado es una
razón Y/X, donde X reemplaza el valor anterior de ST y Y se introduce en la pila así que, después de la
instrucción, ST contiene Y y ST(1) contiene X. El valor previo de ST debe ser un número positivo
menor que pi/4. El resultado de esta instrucción se puede utilizar para calcular otras funciones
trigonométricas, incluyendo seno y coseno.
FPATAN: Calcula el arcotangente de la razón Y/X, donde X está en ST e Y está en ST(1). ST es extraído de
la pila, dejando el resultado en ST, por lo que ambos operandos se destruyen. El valor de Y debe ser
menor que el de X y ambos deben ser positivos. El resultado de esta instrucción se puede usar para
calcular otras funciones trigonométricas inversas, incluyendo arcoseno y arcocoseno.