INF1018 - Software Básico

Aulas de Laboratório

Instruções de Ponto Flutuante em Assembler

Reescreva as funções abaixo em assembler. Teste seus resultados.
  1. float foo (double a, float b) {
      return (a+b)*(a-b);
    }
    
  2. Experimente não colocar o protótipo de foo na sua main. O compilador vai dar um "warning"... O que acontece se você gerar e executar seu programa assim mesmo? Você consegue explicar o que aconteceu?


    ATENÇÃO: na tradução das funções a seguir não use as operações de seno/coseno da unidade de ponto flutuante! Chame explicitamente as funções sin/cos da biblioteca matemática. Lembre-se que o argumento dessas funções é um double, veja protótipos abaixo:

        double sin(double x);
        double cos(double x);
    
    Para gerar seu programa executável, utilize:

    gcc -m32 -Wall -lm ...
    
    (a opção '-lm' é para incluir a biblioteca matemática na ligação)

  3. float foo1 (float a, float b) {
      return sin(a) + b;
    }
    

  4. double foo2 (float a, float b) {
      return sin(a) + cos(b);
    }
    
    Dica1: use um espaço na pilha de execução para guardar o resultado da primeira chamada de função.

    Dica2: muito cuidado com a pilha/localização de parametros e etc... antes e depois das chamadas a sin e cos! Desenhe a pilha de execução e simule essas chamadas!

  5. double foo3 (double *a, int n) {
      int i;
      double r = 0.0;
      for (i=0; i<n; i++) {
        r += sin(*a);
        a++;
      }
      return r;
    }
    
    Dica: você deve guardar a variável local r na pilha!