Thursday, January 9, 2014

PH (ASM) - Varianta 1

Se dau următoarele clase:
 
class Contact
{
public:
 Contact(){
             size1=0;
      size2=0;
        };
 ~Contact(){};
 char nume[30];
 int size1;
 char prenume[30];
 int size2;
 void setNume(char *nume);
        void setPrenume(char *prenume);
        char* getNume();
        char* getPrenume();
};

class Acquaintance : public Contact
{
public:
 Acquaintance(){};
 ~Acquaintance(){} ;
 char email[30];
 int size;
 void setEmail(char* email);
        char* getEmail();
};

class Friend : public Contact
{
public:
 Friend(){};
 ~Friend(){};
 int nrTel;
 void setNrTel( int nrTel );
        int getNrTel();
};
 
Se cere să se implementeze în limbaj de asamblare metodele void setNume(char*), void setPrenume(char*), char* getNume(), char* getPrenume() din clasa Contact precum și metodele void setEmail(char*), char* getEmail(), void setNrTel(int), int getNrTel() din clasele derivate, Acquaintance și Friend.

 Rezolvare:

void setNume(char *nume)
 {
 _asm{
  mov ebx,[ebp+8]
  xor eax, eax
  xor edi, edi
verif:          // verificam daca stringul primit ca parametru
                // nu depaseste dimensiunea maxima pentru atribut
  cmp [ebx+edi],'\0'
  je final_verfi
  inc edi
  jmp verif
final_verfi:    // daca se depaseste atunci iesim din functie
  cmp edi,29
  jge final
  xor esi, esi
for_1:          // copiem fiecare caracter din stringul parametru
                // in atributul corespunzator
  cmp [ebx+esi], '\0'
  je finish_1
  mov dl, [ebx+esi]
  mov [ecx+esi], dl
  inc esi
  jmp for_1
finish_1:       // actualizam atributul pentru lungimea sirului 
                // cu lungimea sirului primit ca parametru 
  mov byte ptr [ecx+esi],'\0'
  mov [ecx+32], esi
  jmp final
final:
 }
}

void setPrenume(char *prenume)
{
 _asm{
  mov ebx,[ebp+8]
  xor eax, eax
  xor edi, edi
verif:          // verificam daca stringul primit ca parametru
                // nu depaseste dimensiunea maxima pentru atribut
  cmp [ebx+edi],'\0'
  je final_verfi
  inc edi
  jmp verif
final_verfi:    // daca se depaseste atunci iesim din functie
  cmp edi,29
  jge final
  xor esi, esi
for_1:          // copiem fiecare caracter din stringul parametru
                // in atributul corespunzator
  cmp [ebx+esi], '\0'
  je finish_1
  mov dl, [ebx+esi]
  mov [ecx+36+esi], dl
  inc esi
  jmp for_1
finish_1:       // actualizam atributul pentru lungimea sirului 
                // cu lungimea sirului primit ca parametru 
  mov byte ptr [ecx+36+esi],'\0'
  mov [ecx+68], esi
  jmp final
final:
 }
}

char* getNume()
{
 _asm{
                // returnam primul atribut
  mov eax, ecx
 }
}

char* getPrenume()
{
 _asm{
                // mergem la adresa primului atribut dupa care
                // ne deplasam la cel de-al treilea adaugand 
                // dimensiunea primului si celui de-al doilea atribut
  mov eax, ecx
  add eax, 36
 }
}

void setEmail(char* email)
{
 _asm{
  mov ebx,[ebp+8]
  xor eax, eax
  xor edi, edi
verif:
  cmp [ebx+edi],'\0'
  je final_verfi
  inc edi
  jmp verif
final_verfi:
  cmp edi,29
  jge final

  xor esi, esi
for_1:
  cmp [ebx+esi], '\0'
  je finish_1
  mov dl, [ebx+esi]
  mov [ecx+72+esi], dl
  inc esi
  jmp for_1
finish_1:
  mov byte ptr [ecx+72+esi],'\0'
  mov [ecx+104], esi
  jmp final
final:
 }
}
char* getEmail()
{
 _asm{
  mov eax, ecx
  add eax, 72
 }
}

void setNrTel( int nrTel )
{
 _asm{
  mov ebx, [ebp+8]
  mov [ecx+72], ebx
 }
}

int getNrTel ()
{
 _asm{
  mov eax, ecx
  add eax, 72
 }
}

No comments:

Post a Comment