Esame di Calcolatori Elettronici Appello del 20/6/'02 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct ss { int v1[3]; char a; int v2[3];}; extern "C" ss fss(char c, int v[], ss sa) { ss ris; int i; ris.a = sa.a + c; for (i=0; i<3; i++) ris.v1[i] = sa.v1[i]+v[i]; for (i=0; i<3; i++) ris.v2[i] = sa.v2[i]+v[3]; return ris; } Esercizio 2) Realizzare quanto richiesto in C++ (scrivere sul file es2.cc ed eseguire). Scrivere un programma che: 1. dichiara una struttura sa di tipo ss inizializzando i campi v1, a, e v2 con gli interi da 1 a 3, il carattere 'F' e gli interi da 4 a 6, rispettivamente; 2. dichiara una struttura sb di tipo ss; 3. dichiara un vettore v di 4 interi inizializzandolo con gli interi da 12 a 15; 4. stampa su uscita standard la struttura sa; 5. chiama la funzione fss() passandole il carattere '0', il vettore v e la struttura sa ed assegnando la struttura restituita a sb; 6. stampa su uscita standard la struttura sa, il vettore v e la struttura sb. Esame di Calcolatori Elettronici Appello del 20/6/'02 (Elettronici) Soluzioni Esercizio 1 #file es1.s .text .global _fss _fss: pushl %ebp movl %esp,%ebp subl $32,%esp #spazio variabili locali pushl %edi pushl %esi pushl %ebx pushl %ecx pushl %edx movl 16(%ebp),%edx #ind. vettore v in edx movb 12(%ebp),%bl #sa.a in bl addb 32(%ebp),%bl #sa.a + c in bl movb %bl, -16(%ebp) #ris.a=sa.a+c movl $0,-32(%ebp) for1: cmpl $3,-32(%ebp) #primo for jl corpo1 jmp fine1 corpo1: movl -32(%ebp),%ecx movl 20(%ebp, %ecx,4),%ebx #sa.v1[i] in ebx addl (%edx,%ecx,4), %ebx #sa.v1[i]+v[i] in ebx movl %ebx, -28(%ebp,%ecx,4) #ris.v1[i]=sa.v1[i]+v[i] incl -32(%ebp) jmp for1 fine1: movl $0,-32(%ebp) for2: cmpl $3,-32(%ebp) #secondo for jl corpo2 jmp fine2 corpo2: movl -32(%ebp),%ecx movl 36(%ebp, %ecx,4),%ebx #sa.v2[i] in ebx addl 12(%edx), %ebx #sa.v2[i]+v[3] in ebx movl %ebx, -12(%ebp,%ecx,4) #ris.v2[i]=sa.v2[i]+v[3] incl -32(%ebp) jmp for2 fine2: movl 8(%ebp), %eax #return ris movl %eax,%edi leal -28(%ebp),%esi cld movl $7,%ecx rep movsl popl %edx popl %ecx popl %ebx popl %esi popl %edi leave ret Esercizio 2 //file es2.cc #include struct ss { int v1[3]; char a; int v2[3]; }; extern "C" ss fss(char c, int v[], ss sa); void stampa(const ss& s) { cout << "v1[] =\t"; for (int i=0; i<3; i++) cout << s.v1[i] << '\t'; cout << endl << "a =\t" << s.a << endl << "v2[] =\t"; for (int i=0; i<3; i++) cout << s.v2[i] << '\t'; cout << endl << endl; } void main() { ss sa={{1,2,3},'F',{4,5,6}},sb; int v[]={12,13,14,15}; cout << "Stampa della struttura sa prima della chiamata alla funzione " << endl; stampa(sa); sb=fss('0',v,sa); cout << "Stampa della struttura sa dopo la chiamata alla funzione " << endl; stampa(sa); cout << "Stampa del vettore v dopo la chiamata alla funzione " << endl; cout << "v[] =\t"; for (int i=0; i<4; i++) cout << v[i] << '\t'; cout << endl << endl; cout << "Stampa della struttura sb dopo la chiamata alla funzione " << endl; stampa(sb); }