But des registres ESI et EDI?

Quel est le but réel et l’utilisation des registres EDI & ESI dans l’assembleur?

Je sais qu’ils sont utilisés pour des opérations de chaîne pour une chose.

Quelqu’un peut-il aussi donner un exemple?

Il y a quelques opérations que vous ne pouvez faire qu’avec DI / SI (ou leurs homologues étendus, si vous n’avez pas appris ASM en 1985). Parmi ceux-ci sont

REP STOSB REP MOVSB REP SCASB 

Quelles sont, respectivement, les opérations pour le stockage, le chargement et le balayage répétés (= en masse). Qu’est-ce que vous faites est que vous définissez SI et / ou DI pour pointer sur un ou les deux opérandes, peut-être mettre un compte dans CX et puis laisser ripper. Ce sont des opérations qui fonctionnent sur un tas d’octets à la fois, et qui mettent en quelque sorte le CPU en mode automatique. Comme vous ne codez pas explicitement les boucles, elles agissent plus efficacement (généralement) qu’une boucle codée à la main.

Juste au cas où vous vous poseriez la question: En fonction de la manière dont vous réglez l’opération, le stockage répété peut être quelque chose de simple, comme poinçonner la valeur 0 dans un grand bloc de mémoire contigu; Je pense que MOVSB ​​est utilisé pour copier des données d’un tampon (et bien d’octets) vers un autre; et SCASB est utilisé pour rechercher un octet qui correspond à un critère de recherche (je ne suis pas sûr que ce soit uniquement en recherchant l’égalité, ou quoi – vous pouvez le rechercher :))

C’est la plupart de ce à quoi ces règlements sont destinés.

SI = Index de source
DI = Index de destination

Comme d’autres l’ont indiqué, ils ont des utilisations spéciales avec les instructions de chaîne. Pour la programmation en mode réel, le registre de segment ES doit être utilisé avec DI et DS avec SI comme dans

 movsb es:di, ds:si 

SI et DI peuvent également être utilisés comme registres d’index à usage général. Par exemple, le code source C

 srcp [srcidx++] = argv [j]; 

comstack en

 8B550C mov edx,[ebp+0C] 8B0C9A mov ecx,[edx+4*ebx] 894CBDAC mov [ebp+4*edi-54],ecx 47 inc edi 

ebp+12 contient argv , ebx est j et edi a srcidx . Notez que la troisième instruction utilise edi mulitplied par 4 et ajoute ebp offset par 0x54 (l’emplacement de srcp ); les parenthèses autour de l’adresse indiquent l’indirection.


Bien que je ne puisse pas me rappeler où je l’ai vu, mais cela confirme la plus grande partie, et ceci (diapositive 17):

AX = accumulateur
DX = accumulateur de mots doubles
CX = compteur
BX = registre de base

Ils ressemblent à des registres à usage général, mais il y a un certain nombre d’instructions qui (de manière inattendue?) En utilisent une, mais laquelle?

Les opcodes tels que MOVSB ​​et MOVSW qui copient efficacement les données de la mémoire pointée par ESI vers la mémoire pointée par EDI. Ainsi,

 mov esi, source_address mov edi, destination_address mov ecx, byte_count cld rep movsb ; fast! 

En plus des opérations sur les chaînes (MOVS / INS / STOS / CMPS / SCASB / W / D, etc.) mentionnées dans les autres réponses, je voulais append qu’il existe également des instructions d’assemblage x86 plus «modernes» qui implicitement moins EDI / RDI:

Les MASKMOVDQU SSE2 MASKMOVDQU (et à venir AVX VMASKMOVDQU ) écrivent de manière sélective des octets d’un registre XMM dans la mémoire pointée par EDI / RDI.

En plus des registres utilisés pour les opérations de masse, ils sont utiles pour leur propriété d’être préservés via un appel de fonction (préservé par l’appel) dans la convention d’appel 32 bits. Les ESI, EDI, EBX, EBP, ESP sont préservés des appels, tandis que EAX, ECX et EDX ne sont pas préservés. Les registres conservés sont respectés par la fonction de bibliothèque C et leurs valeurs persistent lors des appels de fonction de la bibliothèque C.

Jeff Duntemann dans son livre de langage d’assemblage a un exemple de code d’assemblage pour imprimer les arguments de la ligne de commande. Le code utilise esi et edi pour stocker les compteurs car ils ne seront pas modifiés par la fonction printf de la bibliothèque C. Pour d’autres registres comme eax, ecx, edx, rien ne garantit qu’ils ne seront pas utilisés par les fonctions de la bibliothèque C.

https://www.amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025

Voir la section 12.8 Comment C voit les arguments de la ligne de commande.

Notez que les conventions d’appel 64 bits sont différentes des conventions d’appel 32 bits, et je ne suis pas sûr que ces registres soient ou non conservés.