Traduza as funções abaixo para assembly, usando as convenções "normais" para passagem de parâmetros e resultados, alinhamento, etc. Quando necessário, assuma as declarações abaixo (não é necessário traduzí-las para assembler):
struct X { int a,b,c; int arr[20]; } x; int a;
void f (int i) { a += i; /* `a' e' global */ }
void f (void) { int i; for (i=0; i<20; i++) x.arr[i] = 0; /* `x' e' global */ }
int f (int n) { if (n == 0) return 1; else return n*f(n-1); }
int f (struct X *x, int i) { return x->arr[i]; }
int *f (struct X *x, int i) { return &x->arr[i]; }
void f (struct X *x, int i) { int j; j = x->arr[i+x->c]; if (j == 0) a = i; /* `a' e' global */ else a = j; }
Quando necessário, assuma as seguintes declarações (não é necessário traduzí-las para assembler):
extern double a []; extern struct { char c; float x; float y; } b [];
double f1 (double* a, int n) { double s = 0.0; int i; for (i=0; i<n; i++) s += a[i]; return s; }
double f2 (double a, double b, double c) { return a*c + b*c; }
double f2 (double a, double b, double c, int d) { return exp(a)*c + exp(b)*d; }(use a função
double exp (double x)
da biblioteca matemática)double f3 (float a, int b) { return a*b + 3.5; }
int to_int (double v) { return (int) v; }
double to_double (int v) { return (double) v; }
void s (double *a, double *b) { double temp = *a; *a = *b; *b = temp; }
int f (double x, int i) { a[b[i].c] = sin(x) + cos(3.15); return (int)b[i].x; }