INF1018- Software Básico

Mais Funções em Assembly

  1. Considere o código abaixo:
    struct X {
      int val;
      struct X *next;
    };
    
    int add (struct X *x) {
      int a = 0;
      for (; x != NULL; x = x->next)
        a += x->val;
      return a;
    }
    

    Traduza a função add para assembly e use a função main dada a seguir para testá-la.

    #include <stdio.h>
    #define MAX 10 /* MAX tem que ser maior que 1!!!! */
    
    struct X {
      int val;
      struct X *next;
    };
    
    int add (struct X *x);
    
    int main (void) {
    
      struct X x[MAX];
      int i;
    
      for (i=0;i<MAX;i++)
        x[i].val = i;
    
      for (i=MAX-1;i>1;i--)
        x[i].next = &(x[i-1]);
      x[0].next = &(x[MAX-1]);
      x[1].next = NULL;
    
      printf ("resultado de add: %d\n", add(x));
      return 0;
    }
    
  2. Assumindo a definição anterior para a estrutura X, traduza a função abaixo para assembly:

    int add2 (struct X *x) {
      if (x == NULL) return 0;
      else return x->val + add2(x->next);
    }
    
    Use a função main do exercício anterior para testar a nova função.

  3. Considere agora a função boo abaixo:
    struct X {
      int val1;
      int val2;
    };
    
    int f(int i, int v);
    
    void boo (struct X *px, int n, int val) {
      while (n--) {
        px->val2 = f(px->val1, val);
        px++;
      }
    }
    

    Traduza essa função para assembly e use o código abaixo para testá-la.

    #include <stdio.h>
    struct X {
      int val1;
      int val2;
    };
    
    int boo (struct X *px, int n, int val);
    
    int f(int i, int v) {
      if (i >= v)
        return i;
      else
        return v;
    }
    
    int main (void) {
      struct X x[3] = {{1,0}, {2,0}, {3,0}};
      int i;
    
      printf("Antes: ");
      for (i=0; i < 3; i++)
        printf("{%d,%d} ",x[i].val1, x[i].val2);
      boo(x,3,2);
      printf("\nDepois: ");
      for (i=0; i < 3; i++)
        printf("{%d,%d} ",x[i].val1, x[i].val2);
      printf("\n");
      return 0;
    }
    
  4. Considere o código abaixo:

    int f(int x);
    
    void map2 (int* um, int * outro, int n) {
      int i;
      for (i=0; i<n; i++)
        *(outro+i) = f(*(um+i));
    }
    
    Codifique a função map2 em assembly. Teste com uma main escrita em C como essa a seguir:
    #include <stdio.h>
    #define N 10
    
    void map2 (int *um, int *outro, int n);
    
    int f (int x) { return x+2; }
    
    int main (void) {
      int i;
      int a[N], b[N];
      for (i=0;i<N;i++)
        a[i] = i;
      map2(a,b,N);
      for (i=0;i<N;i++)
        printf("%d\n",b[i]);
      return 1;
    }