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 loop e array

Esercizio 1: costrutto while: azzeramento di un array

Si traduca in Assembly IA32 la seguente funzione C, scrivendo un modulo clear.s:

void clear(char* v, unsigned n) { // v è un array, n è la lunghezza dell'array
    unsigned i=0;
    while (i<n) v[i++]=0;

Si suggerisce di riscrivere dapprima il programma in una forma C equivalente in cui il while viene rimpiazzato da un if (…) goto.

Esercizio 2: costrutto while: azzeramento di un array - variante

Si traduca in Assembly IA32 la seguente funzione C, scrivendo un modulo clear2.s:

void clear2(char* v, unsigned n) { // v è un array, n è la lunghezza dell'array
    char* p=v+n;
    while (v<p) *v++=0;
}

Si suggerisce di riscrivere dapprima il programma in una forma C equivalente in cui il while viene rimpiazzato da un if (…) goto.

Esercizio 3

Si traduca in IA32 la seguente funzione che fonde un array ordinato a di size na con un altro array ordinato b di size nb scrivendo il risultato della fusione nell’array c di size almeno (na+nb).

e3.c

void merge(const int* a, const int* b, int* c, int na, int nb) {
    int i=0, j=0, k=0;
    while(i<na && j<nb)
        if (a[i]<=b[j]) c[k++] = a[i++];
        else            c[k++] = b[j++];
    while(i<na) c[k++] = a[i++];
    while(j<nb) c[k++] = b[j++];
}
Esercizio 4

Tradurre la seguente functione C in IA:

#include "e4.h"

void array_div(const int *a, const int *b, div_rem_t *res, int n){
    int i = 0;
    for (i=0; i<n; ++i) {
        int min = a[i] < b[i]  ? a[i] : b[i];
        int max = a[i] >= b[i] ? a[i] : b[i];
        res[i].quot = max / min;
        res[i].rem = max & min;
    }
}

Codice e soluzioni