INF1018 - Software Básico - 2010.2

Aulas de Laboratório

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.)

    #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 bobona, 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 bobona (int a[MAX], int b[MAX]){
    
      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 bobona: %d\n", bobona(um, outro));
      return 1;
    }
    
    
  3. Codifique agora a main da função anterior em assembly.
  4. 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;
    }