Esame di Calcolatori Elettronici Appello del 5/6/'03 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct sru{ int aa[4]; char bb[8]; }; extern "C" sru ela(sru& s1, sru s2) { int i; sru ss; for (i=0; i<4; i++) { s1.aa[i]=s2.aa[i]; ss.aa[i]=s1.aa[i]+s2.aa[i]; ss.bb[i]=s1.bb[i]=s2.bb[i]+s2.bb[2]; } for (i=0; i<4; i++) { ss.bb[i+4]=s2.bb[i]+s2.bb[1]; s1.bb[i+4]=s2.bb[i]+s2.bb[3]; } return ss; } Esercizio 2) Realizzare quanto richiesto in C++ (scrivere sul file es2.cc ed eseguire). Scrivere un programma che: 1. dichiara tre strutture s1, s2 e s3 di tipo sru, inizializzando i campi aa e bb della struttura s2 con gli interi da 0 a 3, e i caratteri da '0' a '7', rispettivamente; 2. stampa su uscita standard la struttura s2; 3. chiama la funzione ela passandole s1 e s2 e assegnando la struttura restituita a s3; 4. stampa su uscita standard s1, s2 e s3. Esame di Calcolatori Elettronici Appello del 5/6/2003 - Soluzioni .text .globl _ela _ela: pushl %ebp movl %esp,%ebp subl $28,%esp pushl %edi pushl %esi pushl %ebx movl 12(%ebp),%edx movl $0,-4(%ebp) for1: cmpl $4,-4(%ebp) jl corpo1 jmp finefor1 corpo1: movl -4(%ebp),%ecx movl 16(%ebp,%ecx,4),%esi #s1.aa[i]=s2.aa[i] movl %esi,(%edx,%ecx,4) addl %esi,%esi #ss.aa[i]=s1.aa[i]+s2.aa[i] movl %esi,-28(%ebp,%ecx,4) movb 34(%ebp),%bl #s1.bb[i]=s2.bb[i]+s2.bb[2] addb 32(%ebp,%ecx),%bl movb %bl, 16(%edx,%ecx) movb %bl,-12(%ebp,%ecx) #ss.bb[i]=s1.bb[i] incl -4(%ebp) jmp for1 finefor1: movl $0,-4(%ebp) for2: cmpl $4,-4(%ebp) jl corpo2 jmp finefor2 corpo2: movl -4(%ebp),%ecx movb 33(%ebp),%bl #ss.bb[i+4]=s2.bb[i]+s2.bb[1] addb 32(%ebp,%ecx),%bl movb %bl, -8(%ebp,%ecx) movb 35(%ebp),%bl #s1.bb[i+4]=s2.bb[i]+s2.bb[3] addb 32(%ebp,%ecx),%bl movb %bl, 20(%edx,%ecx) incl -4(%ebp) jmp for2 finefor2: movl 8(%ebp),%eax movl %eax,%edi leal -28(%ebp),%esi cld movl $6,%ecx rep movsl popl %ebx popl %esi popl %edi leave ret //Esercizio 2 //file es2.cc #include struct sru{ int aa[4]; char bb[8]; }; extern "C" sru ela(sru& s1, sru s2); void stampa(sru s) { cout << "aa[]="; for (int i=0; i<4; i++) cout << s.aa[i] << '\t'; cout << endl; cout << "bb[]="; for (int i=0; i<8; i++) cout << s.bb[i] << '\t'; cout << endl; } void main() { sru s1, s2={{0,1,2,3}, {'0','1','2','3','4','5','6','7'}}, s3; cout << "Stampa della struttura s2 prima della chiamata della funzione" << endl; stampa(s2); s3=ela(s1,s2); cout << "Stampa della struttura s1 dopo la chiamata della funzione" << endl; stampa(s1); cout << "Stampa della struttura s2 dopo la chiamata della funzione" << endl; stampa(s2); cout << "Stampa della struttura s3 dopo la chiamata della funzione" << endl; stampa(s3); }