INF1018- Software Básico

Aulas de Laboratório

Laboratório 9 - Mais Funções

  1. Você terminou todos os laboratórios anteriores (em especial, o lab 8???)? Se não, termine agora.

  2. Escreva em assembly uma função para imprimir cada caracter de uma string recebida como parâmetro. A função recebe um único parâmetro char* (ponteiro para string a ser impressa). Use a função putchar para imprimir cada caracter:

      int putchar(int c);
    
    e termine mandando imprimir o caracter '\n'.

    Faça os exercícios abaixo segundo as regras de tradução vistas em sala.

  3. Considere o código abaixo:

    struct X {
      int c;
      struct X *next;
    };
    
    int add (struct X *x) {
      int a = 0;
      for (; x != NULL; x = x->next)
        a += x->c;
      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 c;
      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].c = 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;
    }
    
  4. 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->c + add2(x->next);
    }
    

  5. Refaça os exercícios anteriores assumindo que a estrutura X tem a definição abaixo:

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

    Dicas:

  6. 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;
    }