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; }; 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) { return x+2; }
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
e a função f
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 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;
}