Sistemi di Calcolo

Corso di Laurea in Ingegneria Informatica e Automatica

Home | Avvisi | Diario Lezioni | Esercitazioni | Esami | Materiale Didattico | Valutazioni Studenti | Lezioni di Camil Demetrescu |

Palestra su struct

Esercizio 1

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

Esercizio 1

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;
}

Esercizio 2

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;
}

Codice e soluzioni