Si traduca in IA32 la seguente funzione che scambia il contenuti di due struct:
e1.h
#ifndef __SWAP_STRUCT__
#define __SWAP_STRUCT__
typedef struct {
char buf[5];
int n;
char enabled;
} buf_t;
void swap(buf_t *b1, buf_t *b2);
#endif
e1.c
#include "e1.h"
void swap(buf_t *b1, buf_t *b2) {
buf_t tmp = *b1;
*b1 = *b2;
*b2 = tmp;
}
Suggerimento: si usi la funzione C standard memcpy definita in stdlib.h
Si traduca in IA32 la seguente funzione che inizializza una lista collegata vuota:
e2.h
#ifndef __NODE_T__
#define __NODE_T__
typedef struct node_t { // base
short elem; // offset: 0 |xx..| (base)
struct node_t *next; // offset: 4 |xxxx| 4(base)
} node_t; // sizeof: 8
void list_new(node_t **l);
int list_new_from_buffer(node_t **l, short* buf, int n);
void list_delete(node_t **l);
int list_add_first(node_t **l, short elem);
int list_sum(const node_t *l);
#endif
e2.c
#include <stdlib.h>
#include "e2.h"
void list_new(node_t **l) {
*l = NULL;
}
Si traduca in IA32 la funzione list_sum
che calcola la somma degli elementi di una lista collegata:
e3.h
#ifndef __NODE_T__
#define __NODE_T__
typedef struct node_t { // base
short elem; // offset: 0 |xx..| (base)
struct node_t *next; // offset: 4 |xxxx| 4(base)
} node_t; // sizeof: 8
void list_new(node_t **l);
int list_new_from_buffer(node_t **l, short* buf, int n);
void list_delete(node_t **l);
int list_add_first(node_t **l, short elem);
int list_sum(const node_t *l);
#endif
e3.c
:
#include <stdlib.h>
#include "e3.h"
int list_sum(const node_t *p) {
int s = 0;
for (; p!=NULL; p=p->next)
s += p->elem;
return s;
}