INF1018 - Software Básico

Aulas de Laboratório

Exercícios de Revisão (II)

  1. Reescreva a função foo abaixo em assembly e escreva uma função main em C para testá-la. Lembre de testar diferentes valores de entrada!

    double foo (double a, int b) {
      return a * (-b);
    }
    

  2. Reescreva agora em assembly a função pack abaixo, e escreva uma função main em C para testá-la (note que a função foo, chamada por pack, já foi testada no exercício anterior!). Para o teste de pack utilize uma lista de estruturas com pelo menos três elementos.

    struct X {
      int vi;
      double vd;
      struct X *next;
    };
    
    double pack (struct X *px) {
      double acc = 0;
      while (px != NULL) {
        acc += foo(px->vd, px->vi);
        px = px->next;
      }
      return acc;
    }
    

  3. Considere os arquivos abaixo: Liste todos os símbolos exportados e importados pelo módulo objeto arq1.o, ou seja, o que seria listado na saída do programa nm como D (símbolos da área de dados exportados), T (símbolos da área de texto/código exportados) e U (símbolos indefinidos/importados).

    Para conferir sua resposta, gere o arquivo objeto arq1.o compilando arq1.c com o comando

        gcc -c arq1.c
    
    
    e execute o programa nm para inspecionar a tabela de símbolos de arq1.o.

  4. Reescreva em assembly a função pack1 abaixo, e escreva uma função main em C para testá-la. A função foo, chamada por pack1, é a mesma do exercício 1.

    struct X1 {
      int vi;
      float vf;
    };
    
    double pack1 (struct X1 *px, int n) {
      double acc = 0;
      int i;
      for (i=0;i<n;i++)
        acc += foo(px[i].vf, px[i].vi);
      }
      return acc;
    }