INF1018 - Software Básico

Assembly: Operações aritméticas e lógicas

  1. Neste laboratório vamos começar a programar em linguagem de montagem. O nosso primeiro programa está aqui. Salve-o em um arquivo prog1.s.

    obs: Trate os trechos de código rotulados com "não mexa" como caixas pretas. Um desses trechos serve para imprimir o número que tiver sido armazenado em eax. Mais tarde no curso discutiremos o que ele contém.

    Para compilar esse programa, basta chamar o gcc:

    > gcc -no-pie -o prog1 prog1.s
    (Pela terminação .s o gcc sabe que o programa está em assembly.)

    Para executá-lo, faça como sempre:

    > ./prog1
    

    Compare o código assembly com o código C (comentado) e veja se você consegue entender a correspondência entre eles...

  2. A modificação do programa C mostrada a seguir imprime apenas a soma dos elementos do array. Traduza essa modificação para assembly.

    Na sua modificação, mantenha o contador (i) em %ebx e o endereço de nums em %r12.

    /*
    int nums[] = {10, -21, -30, 45};
    int main() {
      int i, *p;
      int sum = 0;
      for (i = 0, p = nums; i != 4; i++, p++)
        sum += *p;
      printf("%d\n", sum);
      return 0;
    }
    */
    

  3. A modificação do programa C mostrada a seguir imprime apenas os elementos pares do array. Traduza essa modificação para assembly.

    /*
    int nums[] = {10, -21, -30, 45};
    int main() {
      int i, *p;
      for (i = 0, p = nums; i != 4; i++, p++)
        if ((*p % 2) == 0)
          printf("%d\n", *p);
      return 0;
    }
    */
    

    Dicas:

    • Use uma operação lógica (bit a bit) para testar se o elemento é par, como fizemos no laboratório 3!
    • Cuidado para não perder o valor a ser impresso...

  4. Modifique o primeiro programa (prog1) para usar um array de bytes (char) ao invés de um array de inteiros de 32 bits. Para isso, troque a declaração

    nums:	.int	10, -21, -30, 45
    
    por
    nums:	.byte	10, -21, -30, 45
    
    e faça as modificações necessárias para acessar corretamente os elementos do array de bytes.

    Atenção! O valor a ser impresso é um inteiro de 32 bits, armazenado em %eax. Você deve estender cada byte para o valor equivalente de 32 bits antes de imprimí-lo!