Coprocesador 83087

Anuncio
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
Descargar