Copia stringa

di il
2 risposte

Copia stringa

Ciao a tutti,
devo scrivere una funzione in assembly che copi una stringa ma la stringa risultante ha dei valori iniziali non previsti.
Esempio:
void main(){
	char Stringa1[]="Stringa da copiare";
	char Stringa2[20];
	CopiaStringa(Stringa1,Stringa2);
	printf("%s\n",Stringa2); //Ottengo come output "çççççççç...Stringa da copiare" (con ç intendo dei valori sconosciuti, non saprei riprodurli qui, ma penso abbiate capito)
	getchar();
}
La funzione in assembly è la seguente:
.586
.model flat
.code

_CopiaStringa proc

push ebp
mov ebp,esp

push ebx
push ecx
push edx
push esi
push edi

pop ebx
pop ecx
pop edx
pop esi
pop edi

mov eax,dword ptr[ebp+8]		;Stringa1
mov ebx,dword ptr[ebp+12]	;Stringa2
mov esi,0						;Contatore vettore

;Vedo se la Stringa1 sia vuota
cmp byte ptr[eax],0
je FINE


CICLO:
mov cl,byte ptr[eax+esi]
mov dl,byte ptr[ebx+esi]

cmp cl,0	;Vedo se ho raggiunto il terminatore in Stringa1
je FINE

mov dl,cl	;Effettuo la copia
inc esi	;Incremento contatore ciclo
jmp CICLO


FINE:
mov dl,0	;Inserisco terminatore in Stringa2

mov esp,ebp
pop ebp
ret
_CopiaStringa endp
end
Sapreste dirmi cosa sbaglio?

Inoltre ne approfitto per chiedervi se è corretto ad inizio programma inserire le istruzioni push anche per i registri ecx,edx,edi che non utilizzo. Chiedo inoltre se è corretto inserire subito dopo le istruzioni pop o se queste vanno fatte prima di chiudere la funzione (ho fatto delle prove e non noto alcuna differenza quindi non capisco quale sia la soluzione corretta).

Grazie in anticipo!

2 Risposte

  • Re: Copia stringa

    Tralasciando la parte della gestione di esp ed ebp, il codice è tutto sbagliato ...

    1) le pop devono essere fatte alla fine del programma per i registri modificati ed in ordine inverso alle push (rivedi il concetto di stack)
    2) non scrivi mai dentro la memoria indirizzata dalla seconda stringa
    3) fai confusione con dl ... quando usi dl lavori solo sul registro non sulla memoria
    4) il ciclo ha pezzi ripetuti inutili

    Il codice ottimizzato è
    
    		push eax
    		push ebx
    		push ecx
    		push esi
    
    		mov eax, dword ptr[ebp + 8]; 
    		mov ebx, dword ptr[ebp + 12];
    		
    		mov esi, 0
    
    CICLO:
    		mov cl, byte ptr[eax + esi]
    		mov byte ptr[ebx + esi], cl
    		cmp cl, 0
    		je FINE
    
    		inc esi; 
    		jmp CICLO
    
    FINE :
    		pop esi
    		pop ecx
    		pop ebx
    		pop eax
    
  • Re: Copia stringa

    Tutto chiaro! Mi hai tolto più dubbi di quelli che avevo posto
    Conosco la parte teorica (in effetti il rilascio deve avvenire in ordine inverso visto che vengono "impilati" ) però ho da poco iniziato a metter mano alla pratica (ed in più mi era stato detto che questo esempio fosse stato svolto da un professore...adesso ne dubito!)

    Grazie mille!
Devi accedere o registrarti per scrivere nel forum
2 risposte