Baixe o app para aproveitar ainda mais
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)
Compartilhar