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 |