Esame di Calcolatori Elettronici Appello del 29/5/'02 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct sru{ int aa[4]; char bb[4]; int cc[4];}; extern "C" sru ela(sru s1, sru& s2) { int i; sru ll; for (i=0; i<4; i++) { ll.aa[i]=s1.aa[i]-s2.aa[i]; ll.cc[i]=s1.cc[i]+s2.cc[2]; } ll.bb[0]=ll.bb[1]=s1.bb[0]; ll.bb[2]=ll.bb[3]=s2.bb[1]; return ll; } 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 sru inizializzando i campi aa, bb, e cc con gli interi da 0 a 3, i caratteri da '1' a '4' e gli interi da 2 a 5, rispettivamente; 2. dichiara una struttura ss2 di tipi sru inizializzandola con ss1; 3. dichiara una struttura ss3 di tipo sru; 4. stampa su uscita standard la struttura ss1; 5. chiama la funzione ela() passandole ss1 e ss2 come primo e secondo parametro, rispettivamente, e assegnando la struttura restituita dalla funzione a ss3; 6. stampa su uscita standard le strutture ss1, ss2 e ss3. Esame di Calcolatori Elettronici Appello del 29/5/'02 (Elettronici) - Soluzioni # file es1.s .text .global _ela _ela: pushl %ebp movl %esp,%ebp subl $40,%esp pushl %edi pushl %esi pushl %ebx pushl %ecx movl 48(%ebp),%ebx #indirizzo di s2 in ebx movl $0,-4(%ebp) for: cmpl $4,-4(%ebp) jl corpo jmp finefor corpo: movl -4(%ebp),%ecx movl 12(%ebp,%ecx,4),%edi #s1.aa[i] in edi subl (%ebx,%ecx,4),%edi #s1.aa[i]-s2.aa[i] movl %edi,-40(%ebp,%ecx,4) #ll.aa[i]=s1.aa[i]-s2.aa[i] movl 32(%ebp,%ecx,4),%edi #s1.cc[i] in edi addl 28(%ebx),%edi #s1.cc[i]+s2.cc[2] movl %edi,-20(%ebp,%ecx,4) #ll.cc[i]=s1.cc[i]+s2.cc[2] incl -4(%ebp) jmp for finefor:movb 28(%ebp),%cl #s1.bb[0] in cl movb %cl,-23(%ebp) #ll.bb[1]=s1.bb[0] movb %cl,-24(%ebp) #ll.bb[0]=ll.bb[1] movb 17(%ebx),%cl #s2.bb[1] in cl movb %cl,-21(%ebp) #ll.bb[3]=s2.bb[1] movb %cl,-22(%ebp) #ll.bb[2]=ll.bb[3] movl 8(%ebp),%eax #return ll movl %eax,%edi leal -40(%ebp),%esi cld movl $9,%ecx rep movsl popl %ecx popl %ebx popl %esi popl %edi leave ret //Esercizio 2 #include struct sru{ int aa[4]; char bb[4]; int cc[4];}; extern "C" sru ela(sru s1, sru& s2); void stampa(const sru& s) { cout << "aa[]=\t"; for (int i=0; i<4; i++) cout << s.aa[i] << '\t'; cout << endl; cout << "bb[]=\t"; for (int i=0; i<4; i++) cout << s.bb[i] << '\t'; cout << endl; cout << "cc[]=\t"; for (int i=0; i<4; i++) cout << s.cc[i] << '\t'; cout << endl; } void main() { sru ss1={{0,1,2,3}, {'1','2','3','4'},{2,3,4,5}}; sru ss2=ss1, ss3; cout << "Stampa della struttura ss1 " << endl; stampa(ss1); ss3=ela(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); }