Traduza a função abaixo para assembler:
int foo (int x) { return x+1; }
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
.
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
.
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.