struct X {
int val;
struct X *next;
};
int add (struct X *x) {
int a = 0;
for (; x != NULL; x = x->next)
a += x->val;
return a;
}
Traduza a função add para assembly e use a função
main dada a seguir para testá-la.
#include <stdio.h>
#define MAX 10 /* MAX tem que ser maior que 1!!!! */
struct X {
int val;
struct X *next;
};
int add (struct X *x);
int main (void) {
struct X x[MAX];
int i;
for (i=0;i<MAX;i++)
x[i].val = i;
for (i=MAX-1;i>1;i--)
x[i].next = &(x[i-1]);
x[0].next = &(x[MAX-1]);
x[1].next = NULL;
printf ("resultado de add: %d\n", add(x));
return 0;
}
Assumindo a definição anterior para a estrutura X,
traduza a função abaixo para assembly:
int add2 (struct X *x) {
if (x == NULL) return 0;
else return x->val + add2(x->next);
}
Use a função main do exercício anterior para testar a nova função.
boo abaixo:
struct X {
int val1;
int val2;
};
int f(int i, int v);
void boo (struct X *px, int n, int val) {
while (n--) {
px->val2 = f(px->val1, val);
px++;
}
}
Traduza essa função para assembly e use o código abaixo para testá-la.
#include <stdio.h>
struct X {
int val1;
int val2;
};
int boo (struct X *px, int n, int val);
int f(int i, int v) {
if (i >= v)
return i;
else
return v;
}
int main (void) {
struct X x[3] = {{1,0}, {2,0}, {3,0}};
int i;
printf("Antes: ");
for (i=0; i < 3; i++)
printf("{%d,%d} ",x[i].val1, x[i].val2);
boo(x,3,2);
printf("\nDepois: ");
for (i=0; i < 3; i++)
printf("{%d,%d} ",x[i].val1, x[i].val2);
printf("\n");
return 0;
}
Considere o código abaixo:
int f(int x);
void map2 (int* um, int * outro, int n) {
int i;
for (i=0; i<n; i++)
*(outro+i) = f(*(um+i));
}
Codifique a função map2 em assembly.
Teste com uma main escrita em C como essa a seguir:
#include <stdio.h>
#define N 10
void map2 (int *um, int *outro, int n);
int f (int x) { return x+2; }
int main (void) {
int i;
int a[N], b[N];
for (i=0;i<N;i++)
a[i] = i;
map2(a,b,N);
for (i=0;i<N;i++)
printf("%d\n",b[i]);
return 1;
}