Programación en Ensamblador Ing. Marcelo Tosini - 2001 Introducción • El coprocesador 80x87 funciona en forma independiente al correspondiente procesador 80x86 • De existir un coprocesador, éste es accesible a través de 3 conjuntos de registros: • Pila de datos (accesibles a través de instr. especiales) • Registros punteros y • Registros de estado y control (accesibles a través de puertos) Programación en Ensamblador Ing. Marcelo Tosini - 2001 1 Arquitectura básica de trabajo Dentro del 80x87 los datos se almacenan en una pila circular de 8 reales temporales. Las instrucciones de pto. Flotante operan sobre 1 o más datos de esta pila depositando el resultado nuevamente en el tope de la misma El procesador puede apilar valores, operar sobre los topes repetidamente y extraer los resultados de la pila. Programación en Ensamblador Ing. Marcelo Tosini - 2001 Pila de datos 79 78 64 63 0 0 ST(4) 1 ST(5) 2 ST(6) ST(7) 3 ST ó ST(0) 4 ST(1) 5 ST(2) 6 100 TOP ST(3) 7 S Exponente Mantisa Programación en Ensamblador Ing. Marcelo Tosini - 2001 2 Registros punteros Puntero de instrucciones FIP 00000codop FCS Puntero de datos FOO FOS 31 16 15 Estos registros apuntan a la instrucción y el operando de memoria que ocasionan una excepción 0 FIP : Float Instruction Pointer FCS : Float instruction Code segment FOO : Float Operand Offset FOS : Float Operand Segment Programación en Ensamblador Ing. Marcelo Tosini - 2001 Registros de estado, control y marca Estado Control Marca 15 0 Permiten configurar el modo de funcionamiento del coprocesador, indicar las posibles excepciones a las que debe reaccionar, obtener los flags de pto. Flotante, etc. Programación en Ensamblador Ing. Marcelo Tosini - 2001 3 Registro de estado Estado Control Marca B C3 TOP C2 C1 C0 IR SF PE UE OE ZE DE IE Puntero al tope de pila (ST) Igual a 1 si se detecta una excepción C0 a C3 : Códigos de condición del 387 ST>ST1 ST<ST1 ST=ST1 no orden Fallo de pila Desborde superior o inferior C3 C2 C0 0 0 0 0 0 1 1 0 0 1 1 1 Programación en Ensamblador Ing. Marcelo Tosini - 2001 Registro de control 0 0 0 0 Rc PC No normalizado Operación no válida División por cero Precisión: 00 : Real corto 01 : --10 : Real largo 11 : Real temporal Overflow de pila Redondeo: 00 : más cercano 01 : menos infinito 10 : mas infinito 11 : truncar hacia cero 1 PM UM OM ZM DM IM Desbordamiento inferior Marca 0 Perdida de precicsón Estado Control Tratamiento de excepción 0 = software 1 = hardware Programación en Ensamblador Ing. Marcelo Tosini - 2001 4 Registro de marca Estado Control Marca M7 M6 M5 M4 M3 M2 M1 M0 00 : Dato válido en la posición correspondiente 01 : Cero 10 : Especial 11 : Posición de pila vacía Programación en Ensamblador Ing. Marcelo Tosini - 2001 Tipos de datos soportados Entero de palabra Entero corto Entero largo 16 bits 32 bits 64 bits BCD 80 bits 9 bytes = 18 dígitos s 7 bits sin uso Real corto Real largo Real temporal Programación en Ensamblador Ing. Marcelo Tosini - 2001 32 bits 64 bits 80 bits s exp mantisa s valor = (-) * m 2 e-f 127 real corto f = 1023 real largo 16383 real temporal 5 Formato punto flotante Exponente mantisa (sin ´1´ oculto) tipo 111…….111 111……1 110……1 SNaN “ 1011....11 1000....01 Qnan “ 100…..00 infinitos 11………10 00……....01 111…..11 100…..00 normalizados 00……....00 011…..11 000…..01 no normalizados 00……....00 000…..00 cero Programación en Ensamblador Ing. Marcelo Tosini - 2001 Las instrucciones de Pto. Flotante Generalidades • Todas las instrucciones de punto flotante empiezan con F • Todas las que operan con enteros empiezan con FI • Todas las que operan con BCD empiezan con FB • Todas las que extraen un tope de pila terminan como FxxP • Todas las que extraen dos topes de pila terminan como FxxPP • Todas las instrucciones, a excepción de las que comienzan con FNxx comprueban excepciones no enmascaradas antes de ejecutarse Programación en Ensamblador Ing. Marcelo Tosini - 2001 6 Ejemplo de Instrucciones Carga de enteros FILD op1 mem16 mem32 mem64 Carga un entero de palabra, corto o largo apuntado por op1 en la pila del coprocesador Carga de reales FLD op1 mem32 mem64 mem80 ST(I) Carga un real corto, largo o temporal apuntado por op1 en la pila del coprocesador Programación en Ensamblador Ing. Marcelo Tosini - 2001 Ejemplo de Instrucciones Carga de constantes FLD1 FLDL2E FLDL2T FLDPI FLDZ ; carga 1,0 ; carga log2 e ; carga log2 10 ; carga PI ; carga cero Programación en Ensamblador Ing. Marcelo Tosini - 2001 7 Ejemplo de Instrucciones Extrae entero (no modifica pila) FIST op1 mem16 mem32 mem64 Extrae un entero de palabra, corto o largo de la pila y lo almacena en op1 sin sacarlo de la pila Extrae entero FISTP op1 mem16 mem32 mem64 Extrae un entero de palabra, corto o largo de la pila y lo almacena en op1 Programación en Ensamblador Ing. Marcelo Tosini - 2001 Ejemplo de Instrucciones Extrae real (no modifica pila) FST op1 mem32 mem64 ST(I) Extrae un real corto, largo o temporal de la pila y lo almacena en op1 sin sacarlo de la pila Extrae real FISTP op1 mem132 mem64 ST(I) Extrae un real corto, largo o temporal de la pila y lo almacena en op1 Programación en Ensamblador Ing. Marcelo Tosini - 2001 8 Ejemplos de uso Comparar 2 reales cortos apuntados por DS:EBX y DS:ESI FLD [ebx] FCOMP [esi] FSTSW ax SAHF JP error JE iguales JB menor JA mayor ; Introduce R1 en la pila ; Compara R1 con R2 y saca R1 de la pila ; Carga status word del 387 en AX ; Guarda banderas de AH en Flags ; R1 o R2 eran NaN o infinito o no norm. ; R1 = R2 ; R1 < R2 ; R1 > R2 Programación en Ensamblador Ing. Marcelo Tosini - 2001 Los flags del 386 y el 387 La secuencia de instrucciones FSTSW ax y SAHF tienen como función sacar las banderas del 387 y depositarlas en el 386 Palabra de estado del 386 S Z A Palabra de estado del 387 B C3 top P C C2 C1 C0 Programación en Ensamblador Ing. Marcelo Tosini - 2001 9 Ejemplos de uso Suma de productos de vectores apuntados por DS:EBX y DS:ESI En ASM En C float V1[10]; float V2[10]; float suma = 0; for (i=0,i<10,i++) suma+=V1[i]*V2[i]; ciclo: MOV cx, 10 FLDZ FLD [ebx] FMUL [esi] FADD ADD ebx, 4 ADD esi, 4 LOOP ciclo FST [suma] ; número de iteraciones ; ingreso suma=0 en pila ; almaceno V1[i] ; ST = ST * V2[i] ; ST1 = ST1 + ST, pop ST ; actualizar punteros ; ciclar 10 veces ; almaceno resultado Programación en Ensamblador Ing. Marcelo Tosini - 2001 10