Esame di Calcolatori Elettronici Esame di Calcolatori Elettronici Appello del 10/1/'03 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct stt {int v[5]; char c[10];}; extern "C" stt f(stt s1, stt* s2) { stt s3; int i; for (i=0; i<5; i++) { s2->v[i]=s1.v[i]*s1.v[i]; s3.v[i]=s1.v[i]+(int)s1.c[i]; s3.c[i]=s2->c[i]=s1.c[i]+2*s1.c[1]-s1.c[0]; } for (; i<10;i++) { s2->c[i]=s1.c[i]+2*s1.c[4]-s1.c[6]; s3.c[i]=s2->c[i]+(char)s1.v[0]; } return s3; } 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 stt inizializzando il campo v con gli interi da 0 a 4, ed il campo c con i carattere da '0' a '9'; 2. dichiara due strutture s2 e s3 di tipo stt; 3. stampa su uscita standard la struttura s1; 4. chiama la funzione f() passandole s1 e l'indirizzo di s2 come primo e secondo argomento, rispettivamente, ed assegnando la struttura restituita a s3; 5. stampa su uscita standard le strutture s1, s2 e s3. Esame di Calcolatori Elettronici Appello del 10/1/'03 - Soluzioni # file es1.s .text .global _f _f: pushl %ebp movl %esp,%ebp subl $36,%esp #spazio le variabili locali pushl %edi pushl %esi pushl %ebx pushl %ecx pushl %edx movl $0,-36(%ebp) for1: cmpl $5,-36(%ebp) #primo for jl corpo1 jmp finefor1 corpo1: movl 44(%ebp),%esi #indirizzo struttura puntata da s2 in esi movl -36(%ebp),%ecx movl 12(%ebp,%ecx,4),%eax #s2->v[i]=s1.v[i]*s1.v[i]; imull %eax movl %eax,(%esi,%ecx,4) movsbl 32(%ebp,%ecx),%ebx #s3.v[i]=s1.v[i]+(int)s1.c[i]; addl 12(%ebp,%ecx,4),%ebx movl %ebx,-32(%ebp,%ecx,4) movb 32(%ebp,%ecx), %bl #s3.c[i]=s2->c[i]=s1.c[i]+2*s1.c[1]-s1.c[0]; movb 33(%ebp), %al shlb $1,%al addb %al,%bl subb 32(%ebp),%bl movb %bl, 20(%esi,%ecx) movb %bl, -12(%ebp,%ecx) incl -36(%ebp) jmp for1 finefor1: for2: cmpl $10,-36(%ebp) #secondo for jl corpo2 jmp finefor2 corpo2: movl -36(%ebp),%ecx movb 32(%ebp,%ecx), %bl #s2->c[i]=s1.c[i]+2*s1.c[4]-s1.c[6]; movb 36(%ebp), %al shlb $1,%al addb %al,%bl subb 38(%ebp),%bl movb %bl, 20(%esi,%ecx) addb 12(%ebp),%bl #s3.c[i]=s2->c[i]+(char)s1.v[0]; movb %bl, -12(%ebp,%ecx) incl -36(%ebp) jmp for2 finefor2: movl 8(%ebp),%eax #return s3 leal -32(%ebp),%esi movl %eax,%edi cld movl $8,%ecx rep movsl popl %edx popl %ecx popl %ebx popl %esi popl %edi leave ret //Esercizio 2 //file es2.cc struct stt {int v[5]; char c[10];}; extern "C" stt f(stt s1, stt* s2); #include void stampa(const stt& s) { cout << "v[]= "; for (int i=0; i<5; i++) cout << s.v[i] << ' '; cout << endl << "c[]= "; for (int i=0; i<10; i++) cout << s.c[i] << ' '; cout << endl << endl; } void main() { stt s1={{0,1,2,3,4},{'0','1','2','3','4','5','6','7','8','9'}}; stt s2,s3; cout << "Stampa della struttura s1 prima della chiamata alla funzione" << endl; stampa(s1); s3=f(s1, &s2); 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 della struttura s3 dopo la chiamata alla funzione" << endl; stampa(s3); }