Esame di Calcolatori Elettronici Appello del 13/2/'02 (Elettronici) Esercizio 1) Realizzare in Assembler GNU la seguente funzione (scrivere sul file es1.s ed eseguire): struct ss {char ca; int v; char cb[5]; }; extern "C" ss f(ss ss1, ss& ss2) { ss ss3; int i; ss2.v = ss1.v+(int)ss1.cb[3]; ss3.v = ss2.v+(int)ss1.cb[1]; for (i = 0; i < 5; i++) { ss2.cb[i] = ss1.cb[i]+ss1.ca; ss3.cb[i] = ss2.cb[i]++;} ss3.ca=ss3.cb[2]; ss2.ca=ss3.cb[0]; 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 ca al carattere '0', il campo v all'intero 0 ed il campo cb con i caratteri da '1' a '5'; 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 parametro, rispettivamente, e assegnando la struttura restituita dalla funzione a ss3; 5. stampa su uscita standard le strutture ss1, ss2 e ss3. Esame di Calcolatori Elettronici Appello del 13/2/2002 - Soluzioni # file es1.s .text .globl _f _f: pushl %ebp movl %esp,%ebp subl $20,%esp pushl %esi pushl %ebx pushl %edx pushl %ecx movl 28(%ebp),%edx #indirizzo ss2 in edx movsbl 23(%ebp),%ebx #(int)ss1.cb[3] addl 16(%ebp),%ebx movl %ebx,4(%edx) #ss2.v=ss1.v+(int)ss1.cb[3] movsbl 21(%ebp),%ebx #(int)ss1.cb[1] addl 4(%edx),%ebx movl %ebx,-12(%ebp) #ss3.v = ss2.v+(int)ss1.cb[1] movl $0,-20(%ebp) for: cmpl $5,-20(%ebp) jl corpo jmp finefor corpo: movl -20(%ebp),%ecx movb 12(%ebp), %bl addb 20(%ebp,%ecx), %bl movb %bl, 8(%edx,%ecx) #ss2.cb[i] = ss1.cb[i]+ss1.ca movb %bl,-8(%ebp,%ecx) #ss3.cb[i] = ss2.cb[i] incb %bl movb %bl, 8(%edx,%ecx) #ss2.cb[i]++; incl -20(%ebp) jmp for finefor:movb -6(%ebp),%bl #ss3.ca=ss3.cb[2] movb %bl,-16(%ebp) movb -8(%ebp),%bl #ss2.ca=ss3.cb[0] movb %bl,(%edx) leal -16(%ebp), %esi #return ss3 movl 8(%ebp), %eax movl %eax, %edi movl $4, %ecx cld rep movsl popl %ecx popl %edx popl %ebx popl %esi leave ret //Esercizio 2 //file es2.cc #include struct ss { char ca; int v; char cb[5]; }; extern "C" ss f(ss ss1, ss& ss2); void stampa(const ss& s) { cout << "ca= " << s.ca << endl; cout << "v= " << s.v << endl; cout << "cb[]= "; for (int i=0; i<5; i++) cout << s.cb[i] << ' '; cout << endl << endl; } void main() { ss ss1={'0', 0, {'1','2','3','4','5'}}, 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); }