INF1018- Software Básico

Mais Funções em Assembly

  1. Você terminou o laboratório anterior? Se não, termine agora.

  2. 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;
    }
    
  3. 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.
  4. Refaça os exercícios anteriores assumindo que a estrutura X tem a definição abaixo:

    struct X {
      char val;
      struct X *next;
    };
    

    Dicas:

    • Atenção para as regras de alinhamento de estruturas!
    • Dê uma relembrada nas instruções de movimentação de dados que estendem a representação...
    • Não esqueça de testar também valores negativos...

  5. Considere o código abaixo:
    int f (int x) { return x+2; }
    
    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 e a função f 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 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 0;
    }