Wednesday, January 15, 2014

ACSO (ASM) - Varianta 3

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

void rotateVector(int *v,int n,int pos);

- parametrul v este adresa primului element al unui vector
- parametrul n reprezintă numărul de elemente din vector
- parametrul pos reprezintă numărul de poziții cu care se va roti vectorul 


Funcția deplasează elementele vectorului cu pos poziții.


Exemplu:

Fie vectorul V={10, 5, 20, 8, 30}. După apelul rotateVector(V,5,2), vectorul va arăta în felul următor: {8, 30, 10, 5, 20}.

Rezolvare:

void rotateVector(int *, int, int){
 _asm{
  mov edi, [ebp+8]
  mov ecx,0
loop_1:
  // retinem de fiecare data ultima valoare din vector
  // ca sa putem sa o adaugam pe prima pozitie
  cmp ecx, [ebp+16]
  je final_loop_1
  mov ebx, [ebp+12]
  dec ebx
  mov eax, [edi+ebx*4]
  
loop_2:
  // scriem valorile vectorului una peste alta de
  // la stanga la dreapta
  cmp ebx, 0
  je final_loop_2
  mov esi, ebx
  dec esi
  mov edx, [edi+esi*4]
  mov [edi+ebx*4],edx
  dec ebx
  jmp loop_2
final_loop_2:
  mov [edi+0*4], eax
  inc ecx
  jmp loop_1
final_loop_1:
 }
}

No comments:

Post a Comment