INF1612 - Software Básico

Aulas de Laboratório

Código de Máquina

  1. Traduza a função abaixo para assembler:

    int foo (int x) {
      return x+1;
    }
    

  2. Veja qual o código de máquina que seu programa gera, usando ou objdump -d prog.o ou a opção -Wa,-al do gcc.

  3. Escreva agora um programa em C como descrito a seguir. Esse programa deve criar um array de bytes (unsigned char) preenchido com o código de máquina visto no item anterior. A seguir, ele deve converter o endereço do array para um endereço de função. Para isso, declare o tipo ponteiro para função recebendo int e retornando int, conforme abaixo:

    typedef int (*funcp) (int x);
    
    A seguir, atribua o endereço do array a uma variável do tipo acima:
    funcp f = (funcp)a;
    
    Agora, você pode chamar f como se fosse uma função C normal. Faça isso no seu programa e veja o resultado.

    Obs: em alguns sistemas, pode ser necessário usar a opção -Wa,--execstack ao compilar seu programa com o gcc.

  4. Modifique o programa anterior para ele criar no array o equivalente a função abaixo:

    int foo (int x) {
      return x+K;
    }
    
    onde o número K será dado pelo usuário ao usar o programa.