Reescreva as funções abaixo em assembly.
Para cada função reescrita, crie um arquivo C contendo
uma função main
para testá-la.
Verifique se os resultados estão corretos!
ATENÇÃO: na tradução das funções, não use as operações de
seno/coseno da unidade de ponto flutuante!
Chame explicitamente as funções sin
/cos
da biblioteca matemática.
Lembre-se que o argumento dessas funções é um valor double
, veja protótipos abaixo:
double sin(double x);
double cos(double x);
Para gerar seu programa executável,
utilize:
gcc -m32 -Wall -lm ...(a opção '-lm' é para incluir a biblioteca matemática no passo de ligação)
foo
em assembly.
float foo (double a, float b) { return (a+b)*(a-b); }Experimente não colocar o protótipo de
foo
na sua
main
. O compilador vai dar um "warning"...
O que acontece se você gerar e executar seu programa assim mesmo?
Você consegue explicar o que aconteceu?
foo1
em assembly.
Para testá-la, é importante usar alguns valores de seno bem conhecidos.
Para isso, você pode, por exemplo, incluir na sua função main
o arquivo de cabeçalho math.h
, que define as constantes
M_PI
e M_PI_2
(PI/2).
float foo1 (float a, float b) { return sin(a) + b; }
foo2
em assembly. Novamente,
use para testá-la valores de seno e coseno bem conhecidos!
double foo2 (float a, float b) { return sin(a) + cos(b); }Dica1: use um espaço na pilha de execução para guardar o resultado da primeira chamada de função.
Dica2: muito cuidado com a pilha/localização de parametros e etc... antes e depois das chamadas a sin e cos! Desenhe a pilha de execução e simule essas chamadas!
foo3
em assembly.
double foo3 (double *a, int n) { int i; double r = 0.0; for (i=0; i<n; i++) { r += sin(*a); a++; } return r; }Dica: você deve guardar a variável local
r
na pilha!