Esame di Calcolatori Elettronici Appello del 12/2/'03 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct st { int v[4]; char c[4]; }; extern "C" st f(st s, int v[4], char c[4]) { int i; st temp=s; for (i = 0; i < 4; i++) { if (s.v[i] > v[i]) v[i] =(int) (s.c[i]-c[i]); else temp.v[i] = (int) s.c[i]; c[i] = s.c[i]+(char)s.v[i]; temp.c[i]=c[i/2]; } return temp;} Esercizio 2) Realizzare quanto richiesto in C++ (scrivere sul file es2.cc ed eseguire). Scrivere un programma che: 1. dichiara una struttura s1 di tipo st inizializzando i campi v e c con rispettivamente gli interi da 0 a 3 ed i caratteri da 'a' a 'd'; 2. dichiara una struttura s2 di tipo st; 3. dichiara un vettore v di quattro interi inizializzandolo con gli interi da 4 a 1; 4. dichiara un vettore c di quattro caratteri inizializzandolo con i caratteri da '0' a '3'; 5. stampa su uscita standard la struttura s1; 6. chiama la funzione f() passandole nell'ordine s1, v e c ed assegnando la struttura restituita a s2; 7. stampa su uscita standard le strutture s1 e s2, ed i vettori v e c. Esame di Calcolatori Elettronici Appello del 12/2/2003 - Soluzioni # file es1.s .text .globl _f _f: pushl %ebp movl %esp,%ebp subl $24,%esp pushl %edi pushl %esi pushl %ebx pushl %edx pushl %ecx leal -24(%ebp),%edi leal 12(%ebp),%esi cld movl $5,%ecx rep movsl movl $0,-4(%ebp) for: cmpl $4,-4(%ebp) jl corpo jmp finefor corpo: movl -4(%ebp),%ecx movl 32(%ebp),%ebx #v in ebx movl 12(%ebp,%ecx,4),%edx cmpl %edx,(%ebx,%ecx,4) #if (s.v[i]>v[i]) jge else movl 36(%ebp),%esi #c in %esi movb 28(%ebp,%ecx),%dl #s1.c[i] in dl subb (%esi,%ecx),%dl movsbl %dl,%edx movl %edx, (%ebx,%ecx,4) jmp fineif else: movb 28(%ebp,%ecx),%dl movsbl %dl,%edx movl %edx, -24(%ebp,%ecx,4) fineif: movl 36(%ebp),%esi #c in %esi movb 28(%ebp,%ecx),%dl addb 12(%ebp,%ecx,4), %dl movb %dl,(%esi,%ecx) movl %ecx,%eax sarl $1,%eax movb (%esi,%eax),%dl movb %dl,-8(%ebp,%ecx) incl -4(%ebp) jmp for finefor:movl 8(%ebp),%eax movl %eax,%edi leal -24(%ebp),%esi cld movl $5,%ecx rep movsl pushl %ecx pushl %edx popl %ebx popl %esi popl %edi leave ret //Esercizio 2 //file es2.cc #include struct st { int v[4]; char c[4]; }; extern "C" st f(st s1, int v[4], char c[4]); void stampa(const st& s) { for (int i=0; i<4; i++) cout << s.v[i] << ' '; cout << endl; for (int i=0; i<4; i++) cout << s.c[i] << ' '; cout << endl; } void main() { st s1={{0,1,2,3},{'a','b','c','d'}},s2; int v[]={4,3,2,1}; char c[]={'0','1','2','3'}; cout << "Stampa della struttura s1 prima della chiamata alla funzione " << endl; stampa(s1); s2=f(s1,v,c); cout << "Stampa della struttura s1 dopo la chiamata alla funzione " << endl; stampa(s1); cout << "Stampa della struttura s2 dopo la chiamata alla funzione " << endl; stampa(s2); cout << "Stampa del vettore v" << endl; for (int i=0; i<4; i++) cout <