Esame di Calcolatori Elettronici Appello del 30/1/'02 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct r1 { int v[4]; int n; }; struct r2 { int m; char cc[4]; int p; }; extern "C" r1 f (r1& ra, r2 rb) { r1 rr; for (int i = 0; i < 4; i++) rr.v[i] = (int)rb.cc[i] + rb.m*rb.p; for (int i = 0; i < 4; i++) ra.v[i] = (int)rb.cc[i] - rb.p; rr.n = ra.v[3]; ra.n = ra.v[0]+rb.p; return rr; } Esercizio 2) Realizzare quanto richiesto in C++ (scrivere sul file es2.cc ed eseguire). Scrivere un programma che: 1. dichiara due strutture ra e rr di tipo r1; 2. dichiara una struttura rb di tipo r2 inizializzando il campo m ad 1, il campo cc con i caratteri da 'a' a 'd' e il campo p con l'intero 2; 3. stampa su uscita standard la struttura rb; 4. chiama la funzione f() passandole ra e rb come primo e secondo parametro, rispettivamente, e assegnando la struttura restituita a rr; 5. stampa su uscita standard le strutture ra, rb e rr. Esame di Calcolatori Elettronici Appello del 30/1/2002 - Soluzioni # file es1.s .text .global _f _f: pushl %ebp movl %esp,%ebp subl $24,%esp #spazio per le var. locali pushl %edi pushl %esi pushl %ebx pushl %edx movl $0,-24(%ebp) for1: cmpl $4,-24(%ebp) jl corpo1 jmp finefor1 corpo1: movl -24(%ebp),%ecx movl 24(%ebp),%eax imull 16(%ebp) #rb.m*rb.p in %edx-%eax movsbl 20(%ebp,%ecx),%ebx #(int)rb.cc[i] addl %ebx,%eax movl %eax,-20(%ebp,%ecx,4) #rr.v[i]=(int)rb.cc[i]+rb.m*rb.p incl -24(%ebp) jmp for1 finefor1: movl $0,-24(%ebp) movl 12(%ebp),%edx for2: cmpl $4,-24(%ebp) jl corpo2 jmp finefor2 corpo2: movl -24(%ebp),%ecx movsbl 20(%ebp,%ecx),%ebx #(int) rb.cc[i] subl 24(%ebp),%ebx movl %ebx,(%edx,%ecx,4) #ra.v[i]=(int)rb.cc[i]-rb.p incl -24(%ebp) jmp for2 finefor2: movl 12(%edx),%ecx #rr.n=ra.v[3] movl %ecx,-4(%ebp) movl (%edx),%ebx #ra.n=ra.v[0]+rb.p addl 24(%ebp),%ebx movl %ebx,16(%edx) leal -20(%ebp),%esi #return rr movl 8(%ebp),%edi movl %edi, %eax cld movl $5,%ecx rep movsl popl %edx popl %ebx popl %esi popl %edi leave ret //Esercizio 2 //file es2.cc #include struct r1 { int v[4]; int n; }; struct r2 { int m; char cc[4]; int p; }; extern "C" r1 f (r1& ra, r2 rb); void stampa(const r1& r) { cout << "v[] = "; for (int i=0; i<4; i++) cout << r.v[i] << ' '; cout << endl; cout << "n = " << r.n << endl << endl; } void stampa(const r2& r) { cout << "m = " << r.m << endl; cout << "cc[] = "; for (int i=0; i<4; i++) cout << r.cc[i] << ' '; cout << endl; cout << "p = " << r.p << endl << endl; } void main() { r1 ra,rr; r2 rb={1,{'a','b','c','d'},2}; cout << "Stampa della struttura rb " << endl; stampa(rb); rr=f(ra,rb); cout << "Stampa della struttura ra " << endl; stampa(ra); cout << "Stampa della struttura rb " << endl; stampa(rb); cout << "Stampa della struttura rr " << endl; stampa(rr); }