Monday, January 13, 2014

ACSO (ASM) - Varianta 1

Să se scrie în limbaj de asamblare o funcție definită astfel: 

int Produs(int *v);

 
unde v este adresa de început a unui vector, care se termină printr-un element cu valoarea 0.
Elementele vectorului sunt nenule. 


Funcția returnează produsul numerelor mai mici decât media numerelor din vector (din care
nu face parte elementul final, cu valoarea 0).


Rezolvare:

int Produs(int *){
 _asm{
  mov ebx, [ebp+8]
  xor ecx, ecx // retinem suma numerelor pentru medie
  xor edi, edi // contor pentru medie
loop_1:   // calculam media numerelor din vector
  cmp [ebx], 0
  je final_loop_1
  add ecx, [ebx]
  inc edi
  add ebx, 4
  jmp loop_1
final_loop_1:
  mov eax, ecx
  xor edx, edx
  div edi
  mov esi, eax // punem rezultatul mediei in esi pentru 
   // a avea liber registrul eax pentru produsul numerelor
  mov eax, 1
  mov ebx, [ebp+8]
loop_2:    // calculam produsul numerelor
    // mai mici decat media
  cmp [ebx], esi
  jge final_loop_2
  mul [ebx]
  add ebx, 4
  jmp loop_2
final_loop_2:
  // valoarea returnata de functie va fi
  // ceea ce se afla in registrul eax
  // in cazul nostru va fi direct produsul
 }
}

No comments:

Post a Comment