Esame di Calcolatori Elettronici Appello del 25/9/'02 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct ss {int v1[5]; char c; int v2[5];}; extern "C" ss f(ss ss1, ss& ss2) { ss ss3; int i; for (i=0; i<5; i++) { ss2.v1[i]=ss1.v1[i]+ss1.c; ss3.v1[i]=ss1.v2[i]*ss1.v2[i]; } for (i=0; i<5;i++) { ss2.v2[i]=ss1.v2[i]+ss1.v2[4]; ss3.v2[i]=ss1.v1[i]*ss1.v1[i] + ss1.v1[1]; } ss2.c=ss3.c=(char)ss2.v1[1]; 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 inizializzando il campo v1 con gli interi da 0 a 4, il campo c con il carattere 'a', ed il campo v2 con gli interi da 0 a 4; 2. dichiara due strutture ss2 e ss3 di tipo ss; 3. stampa su uscita standard la struttura ss1; 4. chiama la funzione f() passandole ss1 e ss2 come primo e secondo argomento, rispettivamente, ed assegnando la struttura restituita a ss3; 5. stampa su uscita standard le strutture ss1, ss2 e ss3. Esame di Calcolatori Elettronici Appello del 25/9/'02 (Elettronici) Soluzioni Esercizio 1 #file es1.s .text .globl _f _f: pushl %ebp movl %esp,%ebp subl $48,%esp pushl %edi pushl %esi pushl %ebx pushl %edx movl 56(%ebp),%ebx movl $0,-48(%ebp) for1: cmpl $5,-48(%ebp) jl corpo1 jmp fine1 corpo1: movl -48(%ebp),%ecx movsbl 32(%ebp),%esi #(int)ss1.c addl 12(%ebp,%ecx,4),%esi #ss2.v1[i]=ss1.v1[i]+ss1.c movl %esi,(%ebx,%ecx,4) movl 36(%ebp,%ecx,4),%eax #ss1.v2[i]*ss1.v2[i] imull 36(%ebp,%ecx,4) movl %eax, -44(%ebp,%ecx,4) incl -48(%ebp) jmp for1 fine1: movl $0,-48(%ebp) for2: cmpl $5,-48(%ebp) jl corpo2 jmp fine2 corpo2: movl -48(%ebp),%ecx movl 52(%ebp),%esi #ss2.v2[i]=ss1.v2[i]+ss1.v2[4] addl 36(%ebp,%ecx,4),%esi movl %esi, 24(%ebx,%ecx,4) movl 12(%ebp,%ecx,4),%eax #ss3.v2[i]=ss1.v1[i]*ss1.v1[i] + ss1.v1[1] imull 12(%ebp,%ecx,4) addl 16(%ebp), %eax movl %eax, -20(%ebp,%ecx,4) incl -48(%ebp) jmp for2 fine2: movb 4(%ebx),%al #ss2.c=ss3.c=(char)ss2.v1[1] movb %al,-24(%ebp) movb %al,20(%ebx) movl 8(%ebp),%eax #return ss3 leal -44(%ebp),%esi movl %eax,%edi cld movl $11,%ecx rep movsl popl %edx popl %ebx popl %esi popl %edi leave ret Esercizio 2 //file es2.cc #include struct ss {int v1[5]; char c; int v2[5];}; extern "C" ss f(ss ss1, ss& ss2); void stampa(const ss& s) { cout << "v1[] = "; for (int i=0; i<5; i++) cout << s.v1[i] << ' '; cout << endl; cout << "c = " << s.c << endl; cout << "v2[] = "; for (int i=0; i<5; i++) cout << s.v2[i] << ' '; cout << endl << endl; } void main() { ss ss1={{0,1,2,3,4},'a',{0,1,2,3,4}}, ss2, ss3; cout << "Stampa della struttura ss1 " << endl; stampa(ss1); 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); }