Esame di Calcolatori Elettronici Appello del 10/1/'02 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct ss { int v; char a[4]; int b[4]; }; extern "C" ss f(ss& ss1, ss ss2) { ss ss3; int i; ss1.v = ss2.v+ss2.b[1]; ss3.v = ss2.v+ss2.b[3]; for (i = 0; i < 4; i++) { ss1.a[i] = ss2.a[i]; ss3.a[i] = ss1.a[i]++;} for (i = 0; i < 4; i++) { ss1.b[i] = ss2.b[i]+3; ss3.b[i] = ss2.b[i]+ss1.b[i]; } 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 campo v a 10, il campo a con i caratteri da 'b' a 'e' e il campo b con gli interi da 1 a 4; 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, rispettivamente, primo e secondo parametro, e assegna il risultato ad ss3; 6. stampa su uscita standard le strutture ss1, ss2 e ss3. Esame di Calcolatori Elettronici Appello del 10/1/2002 - Soluzioni # file es1.s .text .global _f _f: pushl %ebp movl %esp,%ebp subl $28,%esp pushl %edi pushl %esi pushl %edx pushl %ecx movl 12(%ebp),%edx #indir. ss1 in edx movl 16(%ebp),%edi #ss1.v= ss2.v+ss2.b[1] addl 28(%ebp),%edi movl %edi,(%edx) movl 16(%ebp),%edi #ss3.v= ss2.v + ss2.b[3] addl 36(%ebp),%edi movl %edi,-24(%ebp) movl $0,-28(%ebp) #inizializ. i for1: cmpl $4,-28(%ebp) jl corpo1 jmp finefor1 corpo1: movl -28(%ebp),%ecx #ss1.a[i]= ss2.a[i] movb 20(%ebp,%ecx), %al movb %al, 4(%edx,%ecx) movb %al,-20(%ebp,%ecx) #ss3.a[i]=ss1.a[i]++ incb %al movb %al, 4(%edx,%ecx) incl -28(%ebp) jmp for1 finefor1: movl $0,-28(%ebp) #inizializ. i for2: cmpl $4,-28(%ebp) jl corpo2 jmp finefor2 corpo2: movl -28(%ebp),%ecx #ss1.b[i]=ss2.b[i]+3 movl 24(%ebp,%ecx,4),%eax addl $3,%eax movl %eax,8(%edx,%ecx,4) movl 24(%ebp,%ecx,4),%eax #ss3.b[i]=ss2.b[i]+ss1.b[i] addl 8(%edx,%ecx,4),%eax movl %eax,-16(%ebp,%ecx,4) incl -28(%ebp) jmp for2 finefor2:movl 8(%ebp),%eax leal -24(%ebp),%esi movl %eax,%edi cld movl $6,%ecx rep movsl popl %ecx popl %edx popl %esi popl %edi leave ret //Esercizio 2 //file es2.cc #include struct ss { int v; char a[4]; int b[4]; }; extern "C" ss f(ss& ss1, ss ss2); void stampa(ss s) { cout << "v= " << s.v << endl; cout << "a= "; for (int i=0; i<4; i++) cout << s.a[i] << ' '; cout << endl; cout << "b= "; for (int i=0; i<4; i++) cout << s.b[i] << ' '; cout << endl << endl; } void main() { ss ss1,ss2={10, {'b','c','d','e'},{1,2,3,4}}, 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); }