INF1612 - Software Básico

Aulas de Laboratório

Funções e variáveis locais

"Compile" manualmente os códigos abaixo para assembly, ou seja, escreva um programa em linguagem de montagem equivalente ao que seria gerado por um compilador C para cada trecho de código dado. O programa principal você pode fazer como preferir, em C ou assembler.
  1. 
    #include <stdio.h>
    
    typedef struct {
      int a;
      int b;
      char c;
    } tmeustruct;
    
    int boba2 (int val) {
      return 2*val;
    }
    
    int boba(int val) {
      tmeustruct ms;
      static int cont = 0;
    
      cont++;
      ms.b = val;
      ms.c = 2*val/3;
      ms.a = boba2(cont);
    
      return ms.a+ms.b+ms.c;
    }
    
    int main (void) {
      int i;
    
      for (i=0; i<5; i++)
        printf("%d\n", boba(i));
    
      return 0;
    }
    

    Atenção: Nesse caso você pode usar a seguinte forma da instrução idiv:

    idiv	reg8/mem8
    
    que supõe que o dividendo está em %ax e que o divisor é o operando de 8 bits (na memória ou em um registrador) dado na instrução, e coloca o resultado nos oito bits de %al.
  2. 
    int pares (int a[], int n) {
      if (n == 0) return 0;
      else return !(a[0]&1) + pares(a+1,n-1);
    }
    
  3. 
    int fib (int n) {
      if (n <= 1) return 1;
      else return fib(n - 1) + fib(n - 2);
    }
    
  4. 
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 30
    
    int crivoprimos (int n) {
      int primos[MAX];
      int qtos, div, cand, e_primo, soma;
      qtos = 0; soma = 0;
      for (cand = 2; cand<=n; cand++) {
        e_primo = 1;
        for (div=0; div<qtos; div++) {
          if (cand % primos[div]==0) {
            e_primo = 0;
    	break;
          }
        }  
        if (e_primo) {
          primos[qtos] = cand;
          soma += cand;
          qtos++;
        }
      }
      return soma;
    }
    
    int main (int argc, char* argv[]) {
      printf("%d\n", crivoprimos(atoi(argv[1])));
      return 0;
    }