Je suis récemment tombé sur la séquence d'instructions d'assemblage suivante:
rep stos dword ptr [edi]
Pour les répétitions ecx
, stocke le contenu de eax
dans où edi
pointe, incrémentant ou décrémentant edi
(selon l'indicateur de direction) de 4 octets chacun temps. Normalement, ceci est utilisé pour une opération de type memset
.
Habituellement, cette instruction est simplement écrite rep stosd
. Les codeurs d'assemblage expérimentés connaissent tous les détails mentionnés ci-dessus juste en voyant cela. :-)
ETA pour l'exhaustivité (merci PhiS): Chaque itération, ecx
est décrémentée de 1, et la boucle s'arrête lorsqu'elle atteint zéro. Pour stos
, la seule chose que vous observerez est que ecx
est effacé à la fin. Mais, pour scas
ou similaire, où les préfixes repz
/repnz
sont utilisés, ecx
peut être supérieur à zéro si l'opération s'est arrêtée avant d'épuiser ecx
octets/mots/whatevers.
Avant de demander, scas
est utilisé pour implémenter des opérations de type strchr
. :-P
Empty array:
char buff[256] = { };
776 1c5: 48 8d 95 e0 fc ff ff lea -0x320(%rbp),%rdx
777 1cc: b8 00 00 00 00 mov $0x0,%eax
778 1d1: b9 20 00 00 00 mov $0x20,%ecx
779 1d6: 48 89 d7 mov %rdx,%rdi
780 1d9: f3 48 ab **rep stos %rax,%es:(%rdi)**