INF1018 - Software Básico

Aulas de Laboratório

Assembly (tradução de estruturas de controle)

  1. Considere o programa abaixo:

    #include <stdio.h>
    
    char S2[] = {65, 108, 111, 32, 123, 103, 97, 108, 101, 114, 97, 125, 33, 0};
    
    int main (void) {
      char *pc = S2;
    
      while (*pc)
        printf ("%c", *pc++);
    
      printf("\n");
      return 0;
    }
    
    Traduza o programa para assembly usando as regras vistas em sala. "Cole" o início (prólogo) e o final (finalização) do programa visto no laboratório 6. Copie de lá também o trecho de código que imprime o valor de %eax. Esse código utiliza a uma string de formatação criada com endereço Sf. Você terá que criar duas strings de formatação parecidas no novo programa!

  2. Atenção: Nos próximos exercícios, escreva PRIMEIRO o código C para resolver o que se pede, e em seguida traduza-o para assembly. (Os dois códigos são necessários na entrega.)

  3. Modifique o programa C anterior para imprimir somente as letras diferentes de 'a' (minúsculo). (Consulte a tabela ascii se necessário.) Teste-o em C e depois faça a mesma modificação no código assembly.

  4. Agora modifique o programa C para calcular (e imprimir) o comprimento da string S2. Traduza-o para assembly. (Lembre-se de usar a string de formatação correta para imprimir um inteiro.)

  5. Escreva em C um programa que imprima os quadrados dos números de 1 a 10 e depois traduza-o para assembly. (Esse programa não utiliza array global!) Para multiplicar um número por si mesmo em assembly, use a instrução imull.

  6. Traduza agora para assembly o programa abaixo, lembrando o que foi visto em sala sobre cálculo do endereço de cada posição de um array (esse programa não é igual ao visto no laboratório 6!) :

    #include <stdio.h>
    
    int nums[4] = {65, -105, 111, 34};
    
    int main (void) {
      int i;
      int s = 0;
    
      for (i=0;i<4;i++)
        s = s+nums[i];
    
      printf ("soma = %d\n", s);
    
      return 0;
    }