Esame di Calcolatori Elettronici Appello del 30/1/'03 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct sttu { int a[4]; int b[4]; }; extern "C" void f(sttu s1, sttu& s2, int v1[4], int v2[4]) { int i; for (i = 0; i < 4; i++) { if (s1.a[i] > 0) v1[i] = s1.b[i]*s1.b[i]; else v1[i] = s1.b[3-i]; v2[i] = v1[i] + s1.a[i/2]; } s2 = s1; } 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 sttu inizializzando i campi a e b con, rispettivamente, gli interi da –1 a 2 e da 0 a 3; 2. dichiara una struttura s2 di tipo sttu; 3. dichiara due vettori v1 e v2 di quattro interi; 4. stampa su uscita standard la struttura s1; 4. chiama la funzione f() passandole nell'ordine s1, s2, v1 e v2; 5. stampa su uscita standard le strutture s1 e s2, ed i vettori v1 e v2. Esame di Calcolatori Elettronici Appello del 30/1/2003 - Soluzioni # file es1.s .text .globl _f _f: pushl %ebp movl %esp,%ebp subl $4,%esp pushl %edi pushl %esi pushl %ebx pushl %eax pushl %edx movl $0,-4(%ebp) for: cmpl $4,-4(%ebp) jl corpo jmp fine corpo: movl -4(%ebp),%ecx cmpl $0,8(%ebp,%ecx,4) #s1.a[i]>0 jle else movl 44(%ebp),%ebx #v1[i]=s1.b[i]*s1.b[i] movl 24(%ebp,%ecx,4), %eax imull 24(%ebp,%ecx,4) movl %eax,(%ebx,%ecx,4) jmp fineif else: movl $3,%edx #v1[i]=s1.b[3-i]; subl %ecx,%edx movl 44(%ebp),%ebx movl 24(%ebp,%edx,4), %eax movl %eax,(%ebx,%ecx,4) fineif: movl %ecx,%edx #v2[i]=v1[i]+s1.a[i/2] sarl $1,%edx movl 8(%ebp,%edx,4),%eax movl 48(%ebp),%edi addl (%ebx,%ecx,4),%eax movl %eax,(%edi,%ecx,4) incl -4(%ebp) jmp for fine: movl 40(%ebp),%edi #s2=s1 leal 8(%ebp),%esi cld movl $8,%ecx rep movsl popl %edx popl %eax popl %ebx popl %esi popl %edi leave ret //Esercizio 2 //file es2.cc #include struct sttu { int a[4]; int b[4]; }; extern "C" void f(sttu s1, sttu& s2, int v1[4], int v2[4]); void stampa(const sttu& s) { cout << "a[]= "; for (int i=0; i<4; i++) cout << s.a[i] << '\t'; cout << endl; cout << "b[]= "; for (int i=0; i<4; i++) cout << s.b[i] << '\t'; cout << endl; } void main() { sttu s1={{-1,0,1,2},{0,1,2,3}},s2; cout << "Stampa di s1 " << endl; stampa(s1); int v1[4],v2[4]; f(s1,s2,v1,v2); cout << "Stampa di s1 " << endl; stampa(s1); cout << "Stampa di s2 " << endl; stampa(s2); cout << "Stampa di v1 " << endl; for (int i=0; i<4; i++) cout << v1[i] << '\t'; cout << endl; cout << "Stampa di v2 " << endl; for (int i=0; i<4; i++) cout << v2[i] << '\t'; cout << endl; }