Page 1 sur 1

Ecx ok, mais Eax, Ebx et Edx ??

Publié : mar. 30/mai/2006 6:53
par SPH
L'utilité de Ecx en tant que compteur, ok, je comprend le coté pratique.
Mais en pratique, quelle utilité a eax (accumulateur), ebx (base) et edx (donnees) ???

Publié : mar. 30/mai/2006 9:29
par tonton
par experience, je te repond que ce sont juste des nom comme 'paul' et 'jean' et non font rien de particulier.
tout les registres "eax,ebx,ecx,edx,edi,esi,ebp,esp"peuvent etre utilisé comme registre de donnée ou d adresse.(en faisant attention pour le registre "esp" pointeur de pile).
par hailleur ,pour le registre "ecx" il est peut recommandé de l utiliser comme compteur car "loop" est plus lent q une decrementation clasique avec condition.

Publié : mar. 30/mai/2006 10:44
par SPH
tonton a écrit :par ailleurs, pour le registre "ecx" il est peu recommandé de l'utiliser comme compteur car "loop" est plus lent q'une decrementation classique avec condition.
Je suppose que c'est parce que l'ASM decremente ECX (donc 32 bits) alors que si l'on a besoin d'un loop de 100 (8 bits) ou de 40000 (16 bits), ca va plus vite de passer par des registres de tailles adéquates...

Publié : mar. 30/mai/2006 11:46
par tonton
la taille des operandes n affecte pas la vitesse.
un "dec ecx"ou "add eax,ebx" va aussi vite qu "dec cl" ou add al,bl"

mais le couple : dec ecx (ou tout autre registre)
:jnz saut



va plus vite que :loop

Publié : mar. 30/mai/2006 12:27
par djes
Tout ça ça date de la préhistoire des processeurs x86 (qui ont un jeu d'instruction gerbatif quand on a goûté aux 68xxx). Maintenant ça n'est plus qu'un héritage dont on ne tient plus compte.

Publié : mar. 30/mai/2006 13:43
par SPH
Bin, on fait avec ce qu'on a....

Publié : mar. 30/mai/2006 15:39
par flaith
juste pour info, sur un bouquin pas trés récent :
Les registres de travail

Au nombre de 4, ils ont un usage bien précis bien qu'ils puissent servir comme zones de stockage de résultats intermédiaires :

* AX : est un registre de 16 bits appelé "Accumulateur", car il est utilisé lors d'opérations arithmétiques

* BX : est un registre de 16 bits appelé "Registre de base" (cf modes d'adressages)

* CX : est un registre de 16 bits appelé "Compteur" (cf instruction LOOP)

* DX : est un registre de 16 bits appelé "Data" (cf instructions arithmétiques)

...

Il faut aussi savoir que les opérations impliquant les registres sont beaucoup plus rapides que celle impliquant des zones mémoire.
:)

Source : Assembleur facile par Philippe Mercier / Ed MARABOUT INFORMATIQUE

Publié : mar. 30/mai/2006 15:42
par SPH
Comme sur mon bouquin !
Mais je cherchais a savoir ce que ca veux dire concretement...

Publié : mar. 30/mai/2006 16:37
par flaith
en fait, tu les utilises comme tu veux mais, concrétement, le système va les utiliser d'une facon plus précise.

Prenons par exemple Linux et l'interruptions 0x80 (sous dos cela serait : int 0x21) :

READ :

* EAX : contient le nb d'octet lus
* EBX : contient le descripteur/sortie standard (0=stdin, 1=stdout, 2=stderr)
* ECX : contient le pointeur sur le buffer d'entrée des données
* EDX : contient le nb d'octet à lire

sous DOS, pour lire cela sera différent.

Publié : mar. 30/mai/2006 16:49
par Anonyme2
SPH,

je t'invite à télécharger la doc en anglais d'Intel (elle est gratuite au format PDF). Il y a un volume consacré à l'optimisation.

Le fichier Architecture Software Developer s Manual, Volume 1 Basic Architecture te donnera plus d'infos sur les registres 32 et 64 bits

Va au paragraphe 3-4-1 : General purpose registers

Il y est dit les instructions de traitement de chaînes utilisent ECX, ESI et EDI comme opérande.

EAX est l'accumuateur pour les opérandes et les données de résultat

EBX est un pointeur de données pour le segment DS

ECX est un compteur pour les opérations sur les chaînes et les boucles

EDX est pointeur d'entrée/sortie

ESI est un pointeur de données sur les données du segment pointé par DS, c'est aussi un pointeur pour la source pour les opérations de chaînes

EDI est un pointeur de données (ou de destination) dans le segment pointé par ES, c'est aussi un pointeur de destination pour les opérations de chaînes


De souvenir , pour les processeurs 16 bits, certaines instructions étaient plus rapides avec l'accumulateur AX. Avec les nouveaux processeurs Pipeline, le traitement des instructions est assez compliqué.

Publié : mar. 30/mai/2006 17:04
par SPH
Ho, j'ai deja plusieurs fois consulté la doc ASM sur pleins de sites. Je devrais en fait m'y remettre un bon coup...

Publié : mar. 30/mai/2006 18:06
par djes
De toutes façons, ce n'est pas compliqué, dans certaines instructions (comme la manipulation de chaîne et comme dans l'exemple que tu donnais avec loop), tu es obligé d'utiliser les registres spécialisés qui correspondent (comme indiqué dans n'importe quelle doc avec les opcodes). C'est là qu'on voit en quoi ils sont spéciaux. Mais apprendre spécifiquement le rôle particulier de chacun ne sert plus à grand chose. A part bien sûr pour les flags et la pile.

Publié : mar. 30/mai/2006 20:27
par SPH
Je crois avoir lu que Flype (je crois que c'est lui) avait fait une procedure ASM plus rapide que d'autre parce qu'il avait utilisé le segment de données. Comme quoi, il faut toujours savoir utiliser les bonnes instructions.

Publié : mar. 30/mai/2006 22:16
par Flype
ah non çà peut pas être moi :D je rappelle que je me suis noté -5 / 5 dans le sondage :lol: j'arrive à lire l'assembleur sous la torture mais faire une routine de ce genre...