Calcolatori Elettronici

  

Universitą degli Studi di Cassino

Corso di Laurea in
Ingegneria Informatica e delle Telecomunicazioni

   prof. Francesco Tortorella  (mail)

     Anno Accademico 2010/2011

     secondo semestre

 


 

 

Esercitazione n. 5 - 05/05/2011


NOTA

Per realizzare gli esercizi seguenti sarą necessario in alcune circostanze fare una conversione int --> float. A tale scopo esiste l'istruzione
cvt.s.w fd,fs che converte il valore intero presente nel registro fs in un float, trasferendolo poi nel registro fd.

Esempi:
Per azzerare
$f0 ($f0 <- 0.0)
mtc1 $zero,$f0  # trasferisce in f0 il valore 0 (intero)
cvt.s.w $f0,$f0 # fa una conversione intero -> float (single precision)

Per trasferire nel registro
$f2 un valore intero presente in memoria all'etichetta val
lwc1 $f1,val    # trasferisce in f1 il valore di num (intero)
cvt.s.w $f2,$f1  # fa una conversione intero -> float (single precision)
 

Suggerimento:  provare l'istruzione descritta, scrivendo alcune linee di codice che permettano l'esecuzione delle istruzioni nell'esempio. Eseguendo passo passo il codice realizzato, notare come si modifica il valore nei registri coinvolti.

 

Esercizio A

 

Scrivere un programma in Assembly MIPS che legga da input gli elementi di un array di float, salvandoli in uno spazio opportunamente allocato nel segmento .data.  Il programma calcoli la media degli elementi, la memorizzi in uno spazio allocato nel segmento .data e la stampi.

Si consideri a titolo di riferimento il seguente  codice C:

 

float vet[64];

int num;

float media;

 

 

void main()

{

  int i;

  float sum;

  float fnum;

  

  leggi_vet_float(vet,num);

 

  sum=0.0;

  for(i=0;i<num;i++)

     sum=sum+vet[i];

 

  fnum=(float)num;

  sum=sum/fnum;

 

  media=sum;

 

  cout << "La media e': " << media;

  cout << "\n";

}

 

 

void leggi_vet_float(float v[],int &n)

{

  int i;

  float x;

 

  cout << "Numero elementi: ";

  cin >> n;

 

  for(i=0;i<n;i++)

  {

    cout << "Elemento: " ;

    cin >> x;  // qui va utilizzata la syscall read float

    vet[i]=x;

  }

}

 

 

 

 

Esercizio B

 

Modificando il programma realizzato nell'esercizio precedente, realizzare un programma in assembly MIPS che, oltre a quanto gią specificato nell'esercizio A, legga un secondo array  di float e determini quanti elementi di questo siano maggiori della media calcolata sul primo array. Il risultato del conteggio  sia salvato in uno spazio opportunamente allocato nel segmento .data e quindi stampato.  

Si consideri a titolo di riferimento il seguente  codice C:

 

float vet1[64], vet2[64];

int num1,num2;

float media;

int numag;

 

 

void main()

{

  int i,cont;

  float sum;

  float fnum;

  

  leggi_vet_float(vet1,num1);

  leggi_vet_float(vet2,num2);

 

  sum=0.0;

  for(i=0;i<num1;i++)

     sum=sum+vet1[i];

 

  fnum=(float)num;

  sum=sum/fnum;

 

  media=sum;

 

  cout << "La media e': " << media;

  cout << "\n";

 

  cont=0;

  for(i=0;i<num2;i++)

    if(vet2[i]>media)

       cont=cont+1;

 

  numag=cont;

 

  cout<<"Nel vettore 2 ci sono ";

  cout << numag << "elementi maggiori di " << media << "\n";

}

 

 

void leggi_vet_float(float v[],int &n)

{

  int i;

  float x;

 

  cout << "Numero elementi: ";

  cin >> n;

 

  for(i=0;i<n;i++)

  {

    cout << "Elemento: " ;

    cin >> x; // qui va utilizzata la syscall read float

    vet[i]=x;

  }

}

 

 

 


 
     

 

 


Home page del corso

© 2011 Francesco Tortorella.
Ultimo aggiornamento: 19/4/2011.