Buscar

Interface Hardware-Software - 11 Aula IHS FPU

Prévia do material em texto

Interface Hardware-Software 
Intel x86 – Unidade de Ponto Flutuante 
(FPU) 
História de Suporte a Operações de Ponto 
Flutuante nos Processadores Intel 
 Até os anos 70, não havia padronização de ponto flutuante 
nos processadores 
 Operações de ponto flutuante pouco eficientes e pouco 
confiáveis 
- Feito por bibliotecas de SW 
 Intel 8087 (1980): coprocessador para ponto flutuante (FPU) 
- Adiciona instruções de ponto flutuante e pilha específica 
- Aumento de até 500% de desempenho 
- Impulsiona a padronização de representação de ponto 
flutuante (IEEE 754) 
- Introduz também novos tipos de dados 
 Até o 80486, foi um co-processador separado do 
processador, a partir do Pentium foi integrado ao 
processador 
 
Nos Tempos do 8087… 
 Conectado aos barramentos de dados e endereços 
- Conflito no uso do barramento 
- Comunicação entre CPU e 8087 mais lenta 
A Partir do Pentium… 
 Permitiu efetivamente execução simultânea de instruções com 
inteiro e ponto flutuante 
FPU 
integrada a 
CPU 
Benefícios da FPU 
 Instruções que realizam operações complexas como raiz 
quadrada, exponenciação, logarítmo, operações 
trigonométricas 
 
 Novos tipos de dados 
- BCD (Binary Coded Decimal) de 18 dígitos 
- Inteiros de 64 bits 
- Além de ponto flutuante de 32 e 64 bits, um ponto flutuante 
estendido de 80 bits 
 
 Permite que o processador execute instruções com inteiros 
e ponto flutuante em paralelo 
 
Arquitetura da FPU (Registradores ) 
Registradores de Dados 
 Dados são armazenados no formato de ponto flutuante estendido de 
dupla precisão (80 bits) 
- Transparente para o programador que não enxerga este formato 
- Conversão automática de formato 
- Melhor precisão 
Pilha de Registradores 
 Programador enxerga registradores de dados como uma pilha de 
registradores 
- O acesso de um registrador específico é sempre em relação ao topo 
- Muitas instruções não tem operandos explícitos, neste caso serão 
usados operandos que estão nos registradores que estão no topo 
Exemplo de Uso de Pilha de Registradores 
Operando na 
pilha é 
implícito 
Pode-se acessar outro 
elemento da pilha, 
além do topo 
(1) 
(0) 
Pseudo - 
Registrador de Status 
 Guarda o status de operação da FPU 
- Instrução FSTSW armazena este reg em memória ou no AX 
- Bits C0, C1, C2 E C3 têm significados diferentes dependendo da 
instrução 
Registrador de Controle 
 Determina o controle de precisão, arredondamento e infinito 
- Mascara também as exceções presentes no registrador de status 
Não mais utilizado 
23 bits (precisão simples) 
Registrador de Tag 
 Indica o tipo de valor presente em cada registrador da FPU 
– O número entre parênteses se refere ao nome físico do registrador 
(R0,R1,R2,etc) 
Tipos de Dados Suportados pela FPU 
Inteiros 
 Bit mais significativo indica se número é positivo ou negativo 
 Números negativos são representados em complemento de dois 
Word : -32768 a 32767 
Short (Double Word) : -2147483648 a 
2147483647 
 
Long (Quad Word) : -263 a 263 - 1 
 
Inteiros em BCD 
 Necessário 80 bits para codificar um BCD com sinal de 18 dígitos 
 Não é representado como complemento de 10 
- Representado como Sinal - Magnitude 
Apenas 1 bit do byte é 
utilizado para indicar o sinal 
Um dígito na base 10 
é codificado com um 
grupo de 4 bits 
 
Reais 
 Números são normalizados para serem representados como 
1.fracao x 2expoente 
 Somente na forma estendida o “1.” está presente 
- Todos os números entram na FPU são convertidos automaticamente 
para este formato para fazer os cálculos 
Short Real (precisão simples) : -2126 a 2127 
Long Real (precisão dupla) : -21022 a 21023 
 
Extended Real (uso interno) : -216382 a 216383 
 
Padrão IEEE 754 para Ponto Flutuante 
 O expoente é acrescido de um valor de modo que seja sempre 
positivo (biased exponent) 
- Short real: 127 
- Long real: 1023 
 Alguns valores são representados de forma especial 
- Zero: Todos os bits 0 (opcionalmente o sinal pode ser 1) 
- ±Infinito: Todos os bits do expoente = 1, todos os bits mantissa = 0 
- NaN: Todos os bits do expoente = 1, alguns bits mantissa != 0 
 
sinal expoente mantissa (fração) 
Item Precisão simples Precisão dupla
Sinal 1 1
Expoente 8 11
Mantissa 23 52
Total 32 64
Exemplo: Conversão de Decimal para Ponto 
Flutuante 
Problema: 
Converta o número 100.25 para ponto flutuante (short real). 
Solução: 
1- Converta o decimal para binário 
2- Normalize o número 
3- Calcule o expoente “biased” 
4 – Armazene o número em formato de ponto flutuante 
Exemplo: Conversão de Decimal para Ponto 
Flutuante 
Problema: 
Converta o número 100.25 para ponto flutuante (short real). 
Solução: 
1- 100.25 = 1100100.012 
2- 1100100.01 = 1.10010001 x 26 
3- 110 + 01111111 (127 em decimal) = 10000101 
4 – Sinal = 0, Expoente = 10000101, Mantissa = 
10010001000000000000000 
Programando com a FPU 
 
 Instruções de ponto flutuante começam com ‘F’ 
- Começam com os bits “11011” (escape code) 
 
 Registradores de dados não tem um nome fixo 
- Baseado no conceito de pilha de registradores circular 
- ST(0) é o registrador que está no topo da pilha 
 
 Mesma instrução (mnemônico) pode possuir diferentes 
modos de endereçamento 
– Implícitos (na pilha) 
– Memória 
– Registrador 
 
Operandos Implícitos 
 
 Operandos não são especificados 
- Primeiro operando (fonte) é ST(0) 
- Segundo operando (fonte) se houver é o ST(1) 
- Destino sempre é o topo 
 
 Operando (fonte) do topo é desempilhado e resultado é 
armazenado no topo 
 
 Exemplos de instruções: 
– FLD1 – Empilha o valor 1 no topo da pilha de registradores 
– FADDP – Soma S(0) a S(1), desempilha os operandos e 
empilha o resultado 
– FLDPI – Empilha PI no topo da pilha 
 
Exemplo: Operandos Implícitos 
section . text 
global _start 
_start: 
 fld1 
 fldpi 
 faddp 
 
 mov eax, 1 
 mov ebx,0 
 int 80h 
Operando na Memória 
 
 Especifica-se um endereço de memória 
- Outro operando é o topo da pilha 
 
 Valores são carregados no topo da pilha ou desempilhados 
 
 Exemplos de instruções: 
– FLD mem – Empilha (Carrega) o valor presente em mem no 
topo da pilha de registradores 
– FST mem – Armazena o valor no topo da pilha em mem 
– FADD mem – Soma o topo da pilha com valor contido em 
mem e coloca resultado no topo da pilha 
Exemplo: Operando na Memória 
SECTION .data 
a: dd 4.5 
b: dd 3.6 
SECTION . text 
global _start 
_start: 
 fld dword[a] 
 fld dword[b] 
 faddp 
 fst dword[a] 
 
 mov eax, 1 
 mov ebx,0 
 int 80h 
 
4.5 
3.6 
a 
b 
end 
end + 4 
4.5 
8.1 
3.6 
a 
b 
end 
end + 4 
fld 
3.6 
4.5 
8.1 
fld faddp fst 
ST 
ST(1) 
Operandos em Registradores 
 Especificam-se os registradores através do nome em 
relação ao topo da pilha 
- Pode ser especificado 1 ou 2 registradores 
 
 Quando dois registradores especificados, o primeiro é o 
destino e o segundo é fonte 
 
 Caso um registrador especificado, o topo da pilha é destino 
 
 Exemplos de instruções: 
– FLD st(i) – Empilha o valor presente em st(i) 
– FADD st(i), st(j) – Soma st(i) com st(j) e empilha o resultado 
em st(i) 
Exemplo: Operandos em Registradores 
SECTION . text 
global _start 
_start: 
 fld1 
 fldpifld1 
 fadd st0,st2 
 
 mov eax, 1 
 mov ebx,0 
 int 80h 
 
1.0 
fld1 
3.14 
1.0 
1.0 
3.14 
fldpi fld1 fadd 
ST 
ST(1) 
1.0 
2.0 
3.14 
1.0 ST(2)

Continue navegando