Esame di Calcolatori Elettronici Appello del 11/9/'02 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct ss {int v[4]; int ii; char cc[8];}; extern "C" ss f(ss& ss1, ss ss2) { ss ss3; int i; for (i=0; i<4; i++) { ss1.v[i]=ss2.v[i]+ss2.ii; ss3.v[i]=ss1.v[i]+ss2.ii; ss3.cc[i]=ss2.cc[i]; ss1.cc[i+4]=ss2.cc[i]; ss1.cc[i]=ss2.cc[i+4]; ss3.cc[i+4]=ss2.cc[i+1]; } ss1.ii=(int)ss2.cc[0]; ss3.ii=(int)ss2.cc[3]; return ss3; } Esercizio 2) Realizzare quanto richiesto in C++ (scrivere sul file es2.cc ed eseguire). Scrivere un programma che: 1. dichiara una struttura ss1 di tipo ss; 2. dichiara una struttura ss2 di tipo ss inizializzando il campi v con gli interi da 0 a 3, il campo ii con l'intero 10 ed il campo cc con i caratteri da 'a' a 'h', rispettivamente; 3. dichiara una struttura ss3 di tipo ss; 4. stampa su uscita standard la struttura ss2; 5. chiama la funzione f() passandole ss1 e ss2 come primo e secondo argomento, rispettivamente, ed assegnando la struttura restituita a ss3; 6. stampa su uscita standard le strutture ss1, ss2 e ss3. Esame di Calcolatori Elettronici Appello del 11/9/'02 (Elettronici) Soluzioni Esercizio 1 #file es1.s .text .global _f _f: pushl %ebp movl %esp,%ebp subl $32,%esp pushl %edi pushl %esi pushl %edx pushl %ecx movl $0,-4(%ebp) for: cmpl $4,-4(%ebp) jl corpo jmp fine corpo: movl 12(%ebp),%edx #indirizzo di ss1 in edx movl -4(%ebp),%ecx #i in ecx movl 16(%ebp,%ecx,4),%esi #ss1.v[i]=ss2.v[i]+ss2.ii; addl 32(%ebp),%esi movl %esi,(%edx,%ecx,4) addl 32(%ebp),%esi #ss3.v[i]=ss1.v[i]+ss2.ii; movl %esi,-32(%ebp,%ecx,4) movb 36(%ebp,%ecx),%al #ss3.cc[i]=ss2.cc[i]; movb %al, -12(%ebp,%ecx) movl %ecx,%esi #ss1.cc[i+4]=ss2.cc[i]; addl $4,%esi movb %al, 20(%edx,%esi) movb 36(%ebp,%esi),%al #ss1.cc[i]=ss2.cc[i+4]; movb %al, 20(%edx,%ecx) incl %ecx movb 36(%ebp,%ecx),%al #ss3.cc[i+4]=ss2.cc[i+1]; movb %al, -12(%ebp,%esi) incl -4(%ebp) jmp for fine: movl 12(%ebp),%edx #ss1.ii=(int)ss2.cc[0]; movsbl 36(%ebp),%esi movl %esi,16(%edx) movsbl 39(%ebp),%esi #ss3.ii=(int)ss2.cc[3]; movl %esi,-16(%ebp) movl 8(%ebp),%eax movl %eax,%edi leal -32(%ebp),%esi cld movl $7,%ecx rep movsl popl %ecx popl %edx popl %esi popl %edi leave ret Esercizio 2 //file es2.cc #include struct ss {int v[4]; int ii; char cc[8];}; extern "C" ss f(ss& ss1, ss ss2); void stampa(const ss& s) { cout << "v[] = "; for (int i=0; i<4; i++) cout << s.v[i] << ' '; cout << endl; cout << "ii = " << s.ii << endl; cout << "cc[] = "; for (int i=0; i<8; i++) cout << s.cc[i] << ' '; cout << endl << endl; } void main() { ss ss1, ss2={{0, 1, 2, 3}, 10, {'a','b','c','d','e','f','g','h'}}, ss3; cout << "Stampa della struttura ss2 " << endl; stampa(ss2); ss3=f(ss1,ss2); cout << "Stampa della struttura ss1 " << endl; stampa(ss1); cout << "Stampa della struttura ss2 " << endl; stampa(ss2); cout << "Stampa della struttura ss3 " << endl; stampa(ss3); }