INF1018 - Software Básico

3a Lista de Exercícios

  1. Traduza as funções abaixo para assembly, usando as convenções "normais" para passagem de parâmetros e resultados, alinhamento, etc. Quando necessário, assuma as declarações abaixo (não é necessário traduzí-las para assembler):

    struct X {
      int a,b,c;
      int arr[20];
    } x;
    
    int a;
    
    
    1.   void f (int i) {
          a += i;      /* `a' e' global */
        }
      
    2.   void f (void) {
          int i;
          for (i=0; i<20; i++)
            x.arr[i] = 0;          /* `x' e' global */
        }
      
    3.   int f (int n) {
          if (n == 0) return 1;
          else return n*f(n-1);
        }
      
    4.   int f (struct X *x, int i) {
          return x->arr[i];
        }
      
    5.   int *f (struct X *x, int i) {
          return &x->arr[i];
        }
      
    6.   void f (struct X *x, int i) {
          int j;
          j = x->arr[i+x->c];
          if (j == 0) a = i;    /* `a' e' global */
          else a = j;
        }
      

  2. Compile as funções abaixo para assembler, usando as convenções "normais" para passagem de parâmetros e resultados, alinhamento, etc.

    Quando necessário, assuma as seguintes declarações (não é necessário traduzí-las para assembler):

    extern double a [];
    
    extern struct {
      char c;
      float x;
      float y;
    } b [];
    
    1. double f1 (double*  a, int n) {
         double s = 0.0;
         int i;
         for (i=0; i<n; i++)
            s += a[i];
         return s;
      }
      
    2. double f2 (double a, double b, double c) {
         return a*c + b*c;
      }
      
    3. double f2 (double a, double b, double c, int d) {
         return exp(a)*c + exp(b)*d;
      }
      
      (use a função double exp (double x) da biblioteca matemática)
    4. double f3 (float a, int b) {
         return a*b + 3.5;
      }
      
    5. int to_int (double v) {
         return (int) v;
      }
      
    6. double to_double (int v) {
         return (double) v;
      }
      
    7. void s (double *a, double *b) {
         double temp = *a;
         *a = *b;
         *b = temp;
      }
      
    8. int f (double x, int i) {
         a[b[i].c] = sin(x) + cos(3.15);
         return (int)b[i].x;
      }