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.
| [1] | Utilisez nasm -f elf strcpy.asm ; ld -s strcpy.o -o strcpy pour compiler cet exemple. |
| Précédent | Sommaire | Suivant |
| Les structures de contrôle | Niveau supérieur | Programmation structurée en assembleur |