INF1018 - Software Básico - 2010.2

Aulas de Laboratório

Laboratório 9 - Exercícios de Revisão

IMPORTANTE: Antes de fazer os exercícios abaixo, verifique se você não deixou exercícios incompletos nos demais laboratórios! Se sim, complete-os!

  1. 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 1;
    }
    
  2. Considere o código abaixo:

    struct X {
      int v;
      struct X *next;
    };
    
    int f (int x) { return x; }
    
    int add (struct X *x) {
      int a = 0;
      for (; x != NULL; x = x->next)
        a += f(x->v);
      return a;
    }
    
    Codifique a função add (e a f) em assembly. Teste com uma main escrita em C.
  3. Codifique a função fat, com a definição abaixo, em assembly. Teste-a com uma função main escrita em C.

    int fat (int n) {
      if (n==0) return 1;
      else return n*fat(n-1);
    }
    

  4. Execute o código a seguir e explique os resultados mostrados pelo programa.

    #include <stdio.h>
    
    void dump (void *p, int n) {
      unsigned char *p1 = (unsigned char *) p;
      while (n--) {
        printf("%p - %02x\n", p1, *p1);
        p1++;
      }
    }
    
    struct um {
      int f;
      char c;
      short d;
      char i;
    };
    
    struct um a =  {(0x0aaa & -23), ~(12 << 4), (0x0f | 1000), (~(-4) + 1)};
    
    int main (void) {
      dump (&a, sizeof(a));
      return 0;
    }