web-dev-qa-db-fra.com

Que fait la séquence d'instructions d'assemblage "rep stos" x86?

Je suis récemment tombé sur la séquence d'instructions d'assemblage suivante:

rep stos    dword ptr [edi]
46
COMer

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

61
Chris Jester-Young
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)**
0
leesagacious