web-dev-qa-db-fra.com

But de ESI et EDI enregistre?

Quel est l'objectif 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.

Est-ce que quelqu'un peut aussi donner un exemple?

111
Tony The Lion

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

REP STOSB
REP MOVSB
REP SCASB

Ce sont, respectivement, des opérations pour le stockage, le chargement et le balayage répétés (= en masse). Ce que vous faites est que vous configurez SI et/ou DI pour pointer sur un opérande ou sur les deux opérandes, peut-être mettre un compte dans CX puis laisser filer. Ce sont des opérations qui fonctionnent sur plusieurs octets à la fois, et elles mettent en quelque sorte le processeur 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 suivante: en fonction de la manière dont vous définissez l'opération, la mémorisation répétée peut être quelque chose de simple, comme pointer 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 (enfin, de n'importe quel octet) dans un autre; et SCASB est utilisé pour rechercher un octet qui correspond à un critère de recherche (je ne sais pas si c'est uniquement sur l'égalité, ou quoi - vous pouvez le rechercher :))

C'est la plupart de ce que ces règlements sont pour.

71
Carl Smotricz

Des opcodes tels que MOVSB ​​et MOVSW qui copient efficacement les données de la mémoire désignée par ESI) dans la mémoire indiquée par EDI. Ainsi,

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

En plus des opérations sur les chaînes (MOVS/INS/STOS/CMPS/SCASB/W/D/Q, etc.) mentionnées dans les autres réponses, je voulais ajouter qu'il existe également des instructions de montage x86 plus "modernes" qui sont utilisées de manière implicite dans moins EDI/RDI:

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

12
PhiS

En plus des registres utilisés pour les opérations de masse, ils sont utiles pour leur propriété de préservation par le biais d'un appel de fonction (préservé de l'appel) dans la convention d'appel 32 bits. Les ESI, EDI, EBX, EBP, ESP sont préservés des appels alors que EAX, ECX et EDX ne sont pas préservés des appels. Les registres préservés des appels sont respectés par la fonction de bibliothèque C et leurs valeurs persistent jusqu'à ce que la fonction de la bibliothèque C appelle.

Jeff Duntemann, dans son manuel 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 tels que 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

See section 12.8 Comment C voit les arguments de ligne de commande.

Notez que les conventions d’appel 64 bits sont différentes des conventions d’appel 32 bits et je ne sais pas si ces registres sont préservés ou non.

5
Jay Rajput