Juego de Instrucciones Del 8087

Descargar como doc, pdf o txt
Descargar como doc, pdf o txt
Está en la página 1de 4

Juego de instrucciones del 8087

Instrucciones de transferencia de números


FLD mem: Introduce una copia de mem en ST. La fuente debe ser un número real en punto flotante de 4, 8 ó
10 bytes. Este operando se transforma automáticamente al formato real temporal.
FLD ST(num): Introduce una copia de ST(num) en ST.
FILD mem: Introduce una copia de mem en ST. La fuente debe ser un operando de memoria de 2, 4 u 8 bytes,
que se interpreta como un número entero y se convierte al formato real temporal.
FBLD mem: Introduce una copia de mem en ST. La fuente debe ser un operando de 10 bytes, que se interpreta
como un valor BCD empaquetado y se convierte al formato real temporal.
FST mem: Copia ST a mem sin afectar el puntero de pila. El destino puede ser un operando real de 4 u 8 bytes
(no el de 10 bytes).
FST ST(num): Copia ST al registro especificado.
FIST mem: Copia ST a mem. El destino debe ser un operando de 2 ó 4 bytes (no de 8 bytes) y se convierte
automáticamente el número en formato temporal real a entero.
FSTP mem: Extrae una copia de ST en mem. El destino puede ser un operando de memoria de 4, 8 ó 10 bytes,
donde se carga el número en punto flotante.
FSTP ST(num): Extrae ST hacia el registro especificado.
FISTP mem: Extrae una copia de ST en mem. El destino debe ser un operando de memoria de 2, 4 u 8 bytes y
se convierte automáticamente el número en formato temporal real a entero.
FBSTP mem: Extrae una copia de ST en mem. El destino debe ser un operando de memoria de 10 bytes. El
valor se redondea a un valor entero, si es necesario, y se convierte a BCD empaquetado.
FXCH: Intercambia ST(1) y ST.
FXCH ST(num): Intercambia ST(num) y ST.

Instrucciones de carga de constantes


Las constantes no se pueden dar como operandos y ser cargados directamente en los registros del
coprocesador. Dicha constante debe estar ubicada en memoria con lo que luego se podrán usar las
instrucciones arriba mencionadas. Sin embargo, hay algunas instrucciones para cargar ciertas constantes (0, 1,
pi y algunas constantes logarítmicas). Esto es más rápido que cargar las constantes muy utilizadas desde la
memoria.
FLDZ: Introduce el número cero en ST.
FLD1: Introduce el número uno en ST.
FLDPI: Introduce el valor de pi en ST.
FLDL2E: Introduce el valor de log(2) e en ST.
FLDL2T: Introduce el valor de log(2) 10 en ST.
FLDLG2: Introduce el valor de log(10) 2 en ST.
FLDLN2: Introduce el valor de log(e) 2 en ST.

Instrucciones de transferencia de datos de control


El área de datos del coprocesador, o parte de él, puede ser guardado en memoria y luego se puede volver a
cargar. Una razón para hace esto es guardar una imagen del estado del coprocesador antes de llamar un
procedimiento (subrutina) y luego restaurarlo al terminar dicho procedimiento. Otra razón es querer modificar
el comportamiento del NDP almacenando ciertos datos en memoria, operar con los mismos utilizando
instrucciones del 8086 y finalmente cargarlo de nuevo en el coprocesador. Se puede transferir el área de datos
del coprocesador, los registros de control, o simplemente la palabra de estado o de control.
Cada instrucción de carga tiene dos formas: La forma con espera verifica excepciones de errores numéricos
no enmascarados y espera a que sean atendidos. La forma sin espera (cuyo mnemotécnico comienza con
"FN") ignora excepciones sin enmascarar.
FLDCW mem2byte: Carga la palabra de control desde la memoria.
F[N]STCW mem2byte: Almacena la palabra de control en la memoria.
F[N]STSW mem2byte: Almacena la palabra de estado en la memoria.
FLENV mem14byte: Carga el entorno desde la memoria.
F[N]STENV mem14byte: Almacena el entorno en la memoria.
FRSTOR mem94byte: Restaura el estado completo del 8087.
F[N]SAVE mem94byte: Salva el estado completo 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.

Control del flujo del programa:


El coprocesador matemático tiene algunas instrucciones que pone algunos indicadores en la palabra de estado.
Luego se pueden utilizar estos bits en saltos condicionales para dirigir el flujo del programa.
Como el coprocesador no tiene instrucciones de salto, se deberá transferir la palabra de estado a la memoria
para que los indicadores puedan ser utilizados con las instrucciones del 8086/8088. Una forma sencilla de usar
la palabra de estado con saltos condicionales consiste en mover su byte más significativo en el menos
significativo de los indicadores de la CPU. Por ejemplo, se pueden usar las siguientes instrucciones:

fstsw mem16 ; Guardar palabra de estado en memoria.


fwait ; Asegurarse que el coprocesador lo hizo.
mov ax,mem16 ; Mover a AX.
sahf ; Almacenar byte más significativo en flags.

Palabra de estado C3 C2 C1 C0 (Bits 15-8)


Indicadores 8088 SF ZF X AF X PF X CF (Bits 7-0)

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.

Después de FCOM Después de FTEST C3 C2 C0 Usar


ST > fuente ST es positivo 0 0 0 JA
ST < fuente ST es negativo 0 0 1 JB
ST = fuente ST es cero 1 0 0 JE
No comparables ST es NAN o 1 1 1 JP
infinito proyectivo

FCOM: Compara ST y ST(1).


FCOM ST(num): Compara ST y ST(num).
FCOM mem: Compara ST y mem. El operando de memoria deberá ser un número real de 4 u 8 bytes (no de
10).
FICOM mem: Compara ST y mem. El operando deberá ser un número entero de 2 ó 4 bytes (no de 8).
FTST: Compara ST y cero.
FCOMP: Compara ST y ST(1) y extrae ST fuera de la pila.
FCOMP ST(num): Compara ST y ST(num) y extrae ST fuera de la pila.
FCOMP mem: Compara ST y mem y extrae ST fuera de la pila. El operando de memoria deberá ser un
número real de 4 u 8 bytes (no de 10).
FICOMP mem: Compara ST y mem y extrae ST fuera de la pila. El operando deberá ser un número entero de
2 ó 4 bytes (no de 8).
FCOMPP: Compara ST y ST(1) y extrae dos elementos de la pila, perdiéndose ambos operandos.
FXAM: Pone el valor de los indicadores según el tipo de número en ST. La instrucción se utiliza para
identificar y manejar valores especiales como infinito, cero, números no normalizados, NAN (Not a
Number), etc. Ciertas operaciones matemáticas son capaces de producir estos números especiales. Una
descripción de ellos va más allá del alcance de este apunte.

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.

Control del coprocesador


F[N]INIT: Inicializa el coprocesador y restaura todas las condiciones iniciales en las palabras de control y de
estado. Es una buena idea utilizar esta instrucción al principio y al final del programa. Poniéndolo al
principio asegura que los valores en los registros puestos por programas que se ejecutaron antes no
afecten al programa que se comienza a ejecutar. Poniéndolo al final hará que no se afecten los
programas que corran después.
F[N]CLEX: Pone a cero los indicadores de excepción y el indicador de ocupado de la palabra de estado.
También limpia el indicador de pedido de interrupción del 8087.
FINCSTP: Suma uno al puntero de pila en la palabra de estado. No se afecta ningún registro.
FDECSTP: Resta uno al puntero de pila en la palabra de estado. No se afecta ningún registro.
FREE ST(num): Marca el registro especificado como vacío.
FNOP: Copia ST a sí mismo tomando tiempo de procesamiento sin tener ningún efecto en registros o
memoria.

También podría gustarte