2.5. Copie de chaîne

Pour vous montrer dans quel cas on utilise les registres d'offset esi et edi, nous allons aborder sommairement, toujours dans le cadre de l'étude des boucles, le traitement des chaînes de caractères.

Le programme suivant recopie la chaîne se trouvant dans la variable strsrc dans la variable strdst[1] :

Exemple strcpy.asm


	section        .text
		global        _start
	  
	_start:
		mov esi,strsrc
		mov edi,strdst
		mov ecx,strsrc_len
	debut:
		mov eax,[esi]
		mov [edi],eax
		inc esi
		inc edi
		loop debut
	fin:       
		mov        eax,1
		int        0x80
	  
	section .data
		strsrc db "premiere chaine",0x0A
		strsrc_len equ $ - strsrc
		strdst times strsrc_len db 0
	

Nous avons vu au Tableau 2-3 que les registres esi et edi servaient aux opérations sur les chaînes. Ici, nous faisons pointer esi vers la variable contenant la chaîne source, et edi vers la variable de destination. Ensuite, nous mettons dans ecx le nombre de caractères à recopier, puis nous bouclons jusqu'à ce que l'instruction loop ait assez décrémenté ecx pour le mettre à zéro.

Au sein de la boucle, nous prenons chacun des caractères contenus par esi et nous les mettons dans edi . Pour ce faire, nous sommes obligés de passer par un registre intermédiaire car il est impossible de copier directement le contenu de l'un vers l'autre. Après chaque copie de caractère, on incrémente esi et edi pour qu'ils pointent sur le caractère suivant.

Ces opérations vous paraissent lourdes ? Effectivement... Ces copies étant quelque chose de courant, il existe des instructions qui les optimisent :-)

En fait, on aurait dû coder la boucle ci-dessus comme suit :


	  mov ecx,strsrc_len
	  mov esi,strsrc
	  mov edi,strdst
	  rep movsb
	

Le processeur exécutera ce code près de trois fois plus vite que le code précédent. L'instruction rep, associée à une instruction comme movsb répètera autant de fois que ecx le lui « demandera » en le décrémentant automatiquement.

Notes

[1]

Utilisez nasm -f elf strcpy.asm ; ld -s strcpy.o -o strcpy pour compiler cet exemple.