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