Esame di Calcolatori Elettronici Appello del 10/7/'02 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct r1 { int a; int v1[4]; int b; }; struct r2 { int v2[4]; int c; }; extern "C" r1 fff (r1 sa, r2& sb) { r1 rr; for (int i = 0; i < 4; i++) rr.v1[i] = sa.v1[i] + sb.v2[i] - sa.a; for (int i = 0; i < 4; i++) sb.v2[3-i] = sa.v1[i] + sa.b + sb.c; rr.a = rr.b = sa.v1[0]; return rr; } Esercizio 2) Realizzare quanto richiesto in C++ (scrivere sul file es2.cc ed eseguire). Scrivere un programma che: 1. dichiara una struttura ssa di tipo r1 inizializzando i campi a, v1, e b con l'intero 0, gli interi da 0 a 3, e l'intero 15, rispettivamente; 2. dichiara una struttura ssb di tipo r2 inizializzando i campi v2 e c con gli interi da 10 a 13, e l'intero 20; 3. dichiara una struttura ssc di tipo r1; 4. stampa su uscita standard le strutture ssa e ssb, rispettivamente; 5. chiama la funzione fff() passandole come parametri ssa e ssb ed assegnando la struttura restituita a ssc; 6. stampa su uscita standard ssa, ssb e ssc. Esame di Calcolatori Elettronici Appello del 10/7/'02 (Elettronici) Soluzioni Esercizio 1 #file es1.s .text .globl _fff _fff: pushl %ebp movl %esp,%ebp subl $28,%esp pushl %edi pushl %esi pushl %ebx pushl %ecx movl 36(%ebp),%ebx movl $0,-28(%ebp) for1: cmpl $4,-28(%ebp) jl corpo1 jmp fine1 corpo1: movl -28(%ebp),%ecx movl 16(%ebp,%ecx,4),%edi #primo for addl (%ebx,%ecx,4),%edi subl 12(%ebp),%edi movl %edi,-20(%ebp,%ecx,4) incl -28(%ebp) jmp for1 fine1: movl $0,-28(%ebp) for2: cmpl $4,-28(%ebp) #secondo for jl corpo2 jmp fine2 corpo2: movl $3,%ecx subl -28(%ebp),%ecx movl -28(%ebp),%esi movl 16(%ebp,%esi,4),%edi addl 32(%ebp),%edi addl 16(%ebx),%edi movl %edi,(%ebx,%ecx,4) incl -28(%ebp) jmp for2 fine2: movl 16(%ebp),%edi movl %edi,-4(%ebp) #rr.a=rr.b=sa.v1[0] movl %edi,-24(%ebp) movl 8(%ebp),%eax #restituzione della struttura rr leal -24(%ebp),%esi movl %eax,%edi cld movl $6,%ecx rep movsl popl %ecx popl %ebx popl %esi popl %edi leave ret Esercizio 2 //file es2.cc #include struct r1 { int a; int v1[4]; int b; }; struct r2 { int v2[4]; int c; }; extern "C" r1 fff (r1 sa, r2& sb); void stampa(const r1& s) { cout << "a = " << s.a << endl; cout << "v1[]= "; for (int i=0; i<4; i++) cout << s.v1[i] << ' '; cout << endl; cout << "b = " << s.b << endl; } void stampa(const r2& s) { cout << "v2[]= "; for (int i=0; i<4; i++) cout << s.v2[i] << ' '; cout << endl; cout << "c = " << s.c << endl; } void main() { int i; r1 ssa = {0, {0,1,2,3}, 15}; r2 ssb = {{10,11,12,13}, 20}; cout << "Stampa della struttura ssa di tipo r1 prima della chiamata alla funzione" << endl; stampa(ssa); cout << "Stampa della struttura ssb di tipo r2 prima della chiamata alla funzione" << endl; stampa(ssb); r1 ssc = fff(ssa, ssb); cout << "Stampa della struttura ssa di tipo r1 passata alla funzione" << endl; stampa(ssa); cout << "Stampa della struttura ssb di tipo r2 passata alla funzione " << endl; stampa(ssb); cout << "Stampa della struttura ssc di tipo r1 restituita dalla funzione" << endl; stampa(ssc); }