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