Qu'est-ce que “rep ost” x86 instructions de montage de la séquence de le faire?
Je suis récemment tombé sur la suite des instructions de montage de la séquence:
rep stos dword ptr [edi]
Vous devez vous connecter pour publier un commentaire.
Pour
ecx
répétitions, stocke le contenu deeax
oùedi
points, l'incrémentation ou la décrémentation deedi
(en fonction de l'indicateur de direction) de 4 octets à chaque fois. Normalement, il est utilisé pour unmemset
type d'opération.Généralement, cette instruction est tout simplement écrit
rep stosd
. Connu assemblée des codeurs de connaître tous les détails mentionnés ci-dessus juste en voyant que. 🙂ETA pour l'exhaustivité (merci PhiS): à Chaque itération,
ecx
est décrémenté de 1, et la boucle s'arrête quand il atteint zéro. Pourstos
, la seule chose que vous pouvez observer est queecx
est effacée à la fin. Mais, pourscas
ou similaires, où larepz
/repnz
préfixes sont utilisés,ecx
peut être supérieur à zéro si l'opération arrêtée avant d'avoir épuisé lesecx
octets/mots/whatevers.Avant de vous demander,
scas
est utilisé pour la mise en œuvre destrchr
type d'opérations. 😛cx
/ecx
/rcx
). Dans votre cas, puisque vous utilisez la version 32 bits de l'instruction, il va utiliser la version 32 bits de ce registre, ainsi,ecx
.memset(edi, eax, ecx)
, oùedi
,eax
, etecx
sont les registres?...Sauf le 2e paramètre peut être plus qu'un seul octet.memset
, où la chose à définir est un 32 bits (à la différence dememset
, où la chose à définir est unchar
).ecx
spécifie le nombre de dword (et non du nombre d'octets) à définir.memset(edi, eax, ecx * 4)
stosd
, les octets individuels dans le dword peut avoir un contenu différent.rep stosq
, mais assez proche. (démonté avec AT&T syntaxe). Qui dirait non optimisée gcc sortie; il sera inlinerep stos
, dans certains cas, au lieu d'appelermemset
même avec l'optimisation. Évidemment code optimisé ne passez pas séparer les 2 instructions d'obtenir le pointeur dans la RDI, et serait zéro RAX avecxor %eax,%eax
. (Si elle n'a pas d'optimiser loin le tableau entièrement.)mov $0, %eax
à zéro RAX sans le xor-zéro judas optimisation (gcc cherche à-O2
, qui permet-fpeephole2
). À l'aide d'un extra-REX préfixe serait strictement pire avec XOR, comme il le serait avec MOV. Quel est le meilleur moyen de définir un registre à zéro en x86 assemblée: xor, mov ou et?