INF1018 - Software Básico

Aulas de Laboratório

Laboratório 10 - Variáveis Locais

  1. Codifique as duas funções abaixo, swap e main, em assembly.

    "Cole" do primeiro laboratório de assembly para ver como passar os strings de formatação para printf e scanf, respeitando o código das funções apresentadas abaixo.

    #include <stdio.h>
    void swap (int* x, int* y) {
      int z;
      z=*x; *x=*y; *y= z;
    }
    int main (void) {
      int a, b;
      printf ("valor de a? ");
      scanf ("%d", &a);
      printf ("valor de b? ");
      scanf ("%d", &b);
      swap (&a, &b);
      printf ("a = %d\nb = %d\n", a, b);
      return 0;
    }
    
  2. Codifique a função f, com a definição abaixo, em assembly. Teste-a com a função main dada, escrita em C.
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 4
    
    int f (int a[], int b[]){
    
      int local [MAX];
      int  i, acc;
    
      for (i=0;i<MAX;i++)
        local[i] = a[i]+b[i];
    
      acc = 1;
      for (i=0; i<MAX; i++)
        acc = acc*local[i];
    
      return acc;
    }
    
    int main (void) {
      int um[MAX], outro[MAX], i;
      for (i=0;i<MAX;i++) {
        printf ("valor de um[%d]? ",i);
        scanf ("%d", &um[i]);
      }
      for (i=0;i<MAX;i++) {
        printf ("valor de outro[%d]? ",i);
        scanf ("%d", &outro[i]);
      }
      printf ("resultado de f: %d\n", f(um, outro));
      return 0;
    }
    
    
  3. Codifique as funções calcula e foo em assembly. (Comece codificando apenas calcula, teste com o resto em C, e depois codifique foo)
    #include <stdio.h>
    
    int calcula (int a[], int tam) {
      int i = 0;
      int acc = 0;
      for (i=0; i<tam; i++)
        acc += a[i];
      return acc;
    }
    
    int foo (int a[], int tam) {
      int i;
      int b[tam];
      for (i = 0; i<tam; i++)
        b[i] = calcula (&(a[i]), tam-i);
      return calcula (b, tam);
    }
    
    int main (void) {
      int a[4] = {1, 1, 1, 1};
      printf ("%d\n", foo(a,4));
      return 0;
    }