115 votes

But des registres ESI et EDI?

Quel est le but réel et l'utilisation des registres EDI et ESI en 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?

78voto

wallyk Points 33150

SI = Index De Source
DI = Index De Destination

Comme d'autres l'ont indiqué, qu'ils sont spéciaux utilise avec les instructions de chaîne. Pour de vrai mode de programmation, l' ES registre de segment doit être utilisé avec l' DI et DS avec SI comme dans

               movsb  es:di, ds:si

SI et DI peut également être utilisé comme objectif général de l'index des registres. Par exemple, l' C code source

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

compile 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. Avis de la troisième instruction utilise edi mulitplied par 4 et ajoute ebp compensée par 0x54 (à l'emplacement de srcp); les crochets autour de l'adresse indiquer l'indirection.


Bien que je ne me souviens pas où je l'ai vu, mais ce confirme de plus, et ce (diapo 17) autres:

AX = accumulateur
DX = double mot de l'accumulateur
CX = compteur
BX = base de registre

Ils ressemblent à des fins générales de registres, mais il y a un certain nombre d'instructions qui (inattendue?) utiliser l'un d'entre eux-mais lequel?-implicitement.

74voto

Carl Smotricz Points 36400

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

REP STOSB
REP MOVSB
REP SCASB

Qui sont, respectivement, les opérations répétées (= masse) le stockage, le chargement et numérisation. Ce que vous faire est de configurer SI et/ou DI à point, à un ou deux opérandes, peut-être mettre un nombre dans CX, puis laissez - 'er rip. Ce sont des opérations que travailler sur un tas d'octets à la fois, et en quelque sorte de mettre le CPU en mode automatique. Parce que vous n'êtes pas explicitement codage de boucles, ils font leur chose de manière plus efficace (en général) qu'un codés à la main boucle.

Juste au cas où vous vous poseriez la question: en Fonction de la façon dont vous définissez l'opération, répétée le stockage peut être quelque chose de simple comme la perforation de la valeur 0 dans un grand bloc contigu de mémoire; MOVSB est utilisé, je pense, pour copier les données d'un tampon (bien, tout tas d'octets) à l'autre; et SCASB est utilisé pour chercher un octet qui correspond à certains critères de recherche (je ne suis pas sûr si c'est seulement pour la recherche sur l'égalité, ou qu'est – ce- que vous pouvez le regarder :) )

C'est la plupart de ce que les regs sont pour.

33voto

catfood Points 2932

Opcodes comme MOVSB et MOVSW efficacement copier les données de la mémoire pointée par ESI à la mémoire pointé par l'EDI. Ainsi,

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

12voto

PhiS Points 2654

En plus des opérations de la chaîne (MOV/INS/OCT/CMP/SCASB/W/D/Q etc.) mentionné dans les autres réponses, je voulais ajouter qu'il est aussi plus "moderne" x86 instructions de montage qui utilisent implicitement au moins, EDI/RDI:

Le SSE2 MASKMOVDQU (et la prochaine AVX VMASKMOVDQU) l'instruction de manière sélective écrire des octets à partir d'un registre XMM à la mémoire pointé par ESI/RSI.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X