Esercitazioni
Home

 

Esercitazione assegnata in aula multimediale il giorno 5 giugno.


Realizzare un programma che, facendo uso della una subroutine STRLEN capace di restituire la lunghezza di una stringa di caratteri, valuti la piu' lunga tra due stringhe date. Le stringhe si intendano null-terminated.

Ipotesi.

L'area dati del programma principale (accessibile solo da esso) contenga:
le due stringhe null-terminated di indirizzo rispettivamente pari a STR1 e STR2;
una locazione di indirizzo RES destinata a contenere il risultato: esso e'
pari a 1 se STR1 è più lunga di STR2;
pari a 2 se STR2 è più lunga di STR1;
0 altrimenti.
La subroutine accetta come parametro di ingresso l'indirizzo di inizio della stringa e restituisce la sua lunghezza complessiva.
I parametri vengono passati attraverso lo stack.

Soluzione

 
Si scriva un programma assembly che conti i caratteri di una stringa diversi dallo spazio (il codice ASCII dello spazio e' 32 in decimale).

Il conteggio deve essere effettuato attraverso un sottoprogramma CONTA, che riceve l'indirizzo della stringa come parametro sullo stack e restituisce come parametro di ritorno il numero di caratteri della stringa. La stringa e' terminata da '\0' come in C/C++.

Si supponga di chiamare STRINGA l'etichetta relativa all'indirizzo di partenza della stringa. Il codice C++ del sottoprogramma sarà allora:

int CONTA (char STRINGA[]) { 
  int i=0;
  int sum=0;
  while(STRINGA[i]!='\0') {
    if (STRINGA[i]!=' ')
      sum++; 
    i++; 
  }
  return sum;
}

Soluzione

 

Si scriva un programma assembly che conti gli elementi di valore dispari di un vettore di interi.

Il conteggio deve essere effettuato attraverso un sottoprogramma CONTADISP, che riceve l'indirizzo del vettore come parametro sullo stack e restituisce come parametro di ritorno il numero di elementi del vettore di valore dispari. Si supponga di non fornire al sottoprogramma il riempimento del vettore, ma che il vettore sia terminato da un elemento 'tappo' di valore pari a zero.

Si supponga di chiamare VETT l'etichetta relativa all'indirizzo di partenza del vettore. Il codice C++ del sottoprogramma sarà allora:

int CONTADISP (int VETT[]) {
  int i=0;
  int sum=0;
  while(VETT[i]!=0) {
    if (VETT[i]%2==1)
      sum++;
    i++;
  }
  return sum;
}

Soluzione

 

PROVA del 27 Giugno 2002

Si scriva un programma assembly che calcoli il prodotto degli elementi di valore dispari di un vettore di interi.

Il calcolo deve essere effettuato attraverso un sottoprogramma PRODDISP, che riceve l'indirizzo del vettore ed il suo riempimento come parametro sullo stack e restituisce come parametro di uscita il valore PROD.

Si supponga di chiamare VETT l'etichetta relativa all'indirizzo di partenza del vettore.
Il codice C++ del sottoprogramma sarà allora:

void PRODDISP(int VETT[], int RIEMP, int & PROD) {
  PROD=1;
  int i=0;
  while(i<RIEMP) {
    if (VETT[i]%2!=0)
    PROD=PROD*VETT[i];
    i++;
  }
}

Si provi il programma con il vettore [-1 5 6 -3 -7 4 2], avendo cura di allocare l'area dati del MAIN a partire dall'indirizzo $8400.

 

PROVA del 10 Luglio 2002

Si scriva un programma assembly che, date due stringhe di eguale lunghezza, calcoli il numero di caratteri omologhi delle due stringhe che sono uguali.

Il conteggio deve essere effettuato attraverso un sottoprogramma CONTAUG, che riceve l'indirizzo delle due stringhe come parametro sullo stack e restituisce come parametro di uscita il valore CAR_UG.
Le stringhe siano terminata da '\0' come in C/C++

Si supponga di chiamare STR1 e STR2 le etichette relative agli indirizzi di partenza delle due stringhe.
Il codice C++ del sottoprogramma sarà allora:

void CONTAUG (char STR1[], char STR2[], int & CAR_UG){
  int i=0;
  CAR_UG=0;
  while(STR1[i]!='\0') {
    if (STR1[i]==STR2[i])
    CAR_UG++;
    i++;
  }
}

Si provi il programma con le stringhe: 'Oggi 27 Giugno 2002' e 'Ieri 26 Giugno 2002'

avendo cura di allocare nell'area dati del MAIN l'etichetta CAR_UG a partire dall'indirizzo $8400.

n.b.: con queste stringhe il valore di CAR_UG sara' 15.