Fonctionnement d'une procedure assembleur avec delphi

Résolu
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 - 1 août 2008 à 11:04
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 - 4 août 2008 à 18:23
Bonjour,

j'essaye de transformer un code que j'ai trouvé et que j'aimerais écrire en delphi normal

Voici le code en question :

procedure MoveI32(const Source; var Dest; Count: Integer); Register;
ASM
        cmp   ECX,0
        Je    @JustQuit
        push  ESI
        push  EDI
        mov   ESI, EAX
        mov   EDI, EDX
    @Loop:
    Mov   AL, [ESI]
        Inc   ESI
        mov   [EDI], AL
        Inc   EDI
        Dec   ECX
        Jnz   @Loop
        pop   EDI
        pop   ESI
    @JustQuit:
end;        

Si quelqu'un pouvait me dire à quoi sert cette fonction.
Je ne comprend rien à l'assembleur mélé avec du delphi.
Comme j'ai juste ce bout de code à convertir en instruction pascal standard, je me permet de demander de l'aide.
En effet, je ne sais pas comment les valeurs "sources","dest" et "count" déclaré dans la procedure sont utilisé dans le code assembleur.
Je pense qu'il y a un rapport avec les registre ECX,ESI,EDI mais qui va ou ???

Merci pour vos réponses.

Bonne journée
Oniria

6 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
1 août 2008 à 12:37
Salut !

@Source: EAX
@Dest: ECX
Count: EDX

Puisqu'on est en convention Resigter, les trois premiers paramètres sont passées via les registres CPU dans l'ordre, le reste est empilé.
C'est quand même con d'avoir une fonction sans savoir à quoi elle sert !

On dirait que ça copie Count octets Source dans Dest tout simplement (en passant octet par octet dans un registre intermédiaire AL).
C'est très con comme méthode en fait. Et pas optimisé du tout: elle pourrait copier 4 octets par 4 octets...

Moi je la remplacerai juste par la fonciton pascal standard Move()

Voila,
A+
Flo

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
4 août 2008 à 15:54
// register, facultatif puisque mode par defaut de Delphi.

// copie Source dans Dest byte par byte

procedure MoveI32(const Source; out Dest; const Count: Integer);
var pS, pD : ^byte;
    N : integer;
begin
  pS := @Source;
  pD := @Dest;
  for N := 0 to Count-1 do
  begin
    pD^ := pS^;
    inc(pS);
    inc(pD);
  end;
end;






3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
1 août 2008 à 12:39
Autant pour moi je me suis trompé dans les registres mais c'est bien une fonction de copie.
0
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
1 août 2008 à 14:15
Merci bien florenth.
Ca y ai, j'ai compris, ce que je ne savais pas c'était que lorsque l'on place register à la fin de la procedure, delphi charge les paramétres dans l'ordre des registres EAX,EDX,ECX.

Ce sous programme est bien une copie d'un nombre count de source vers dest.
Je placerais le petit bout de code équivalent lorsque je l'aurais fait pour d'autres personnes. donc l'explication du code est le suivant :

cmp   ECX,0                             // comparaison de count avec 0
        Je    @JustQuit                  // si count = 0 on fini
        push  ESI                          // mise sur la pile de ESI (le but est de ne pas perturber les taches qui ont utilisé ESI avant)
        push  EDI                         // mise sur la pile de EDI
        mov   ESI, EAX               // on met la valeur de EAX dans ESI (l'adresse de source)
        mov   EDI, EDX              // on met la valeur de EDX dans EDI (l'adresse de dest)
    @Loop:                              // début d'une boucle
    Mov   AL, [ESI]                 // on prend l'octet se trouvant à l'adresse contenu dans ESI et onle met dans AL
        Inc   ESI                         // on increment ESI (l'adresse source=source+1)
        mov   [EDI], AL             // on sauvegarde en mémoire la valeur de AL à l'adresse mémoire de EDI
        Inc   EDI                        // on incrémente EDI
        Dec   ECX                    // on décrémente ECX (count=count-1)
        Jnz   @Loop                 // tant que ECX<>0 on reboucle
        pop   EDI                     // on relit l'ancienne valeur de EDI contenu dans la pile
        pop   ESI                     // on relie l'abcienne valeur de ESI contenu dans la pile
    @JustQuit:

En tout cas, merci beaucoup, ca m'enléve une sacré épine du pied.

Oniria
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
4 août 2008 à 16:17
code de la fonction en asm (ollydebuger)

MOV ESI,EAX                // pS = @Source
MOV EAX,ECX                // Count' = Count
DEC EAX                    // Count' - 1
TEST EAX,EAX
JL SHORT fin               // si Count' <= 0 goto fin
INC EAX                    // Count' + 1
@@loop:
  MOVZX ECX,[BYTE DS:ESI]  // Stock Byte = pS^
  MOV [BYTE DS:EDX],CL     // Dest^ = Stock Byte
  INC ESI                  // inc(pS)
  INC EDX                  // inc(Dest)
  DEC EAX                  // dec(Count')
  JNZ SHORT loop           // si Count' > 0 goto loop
@@fin:






0
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
4 août 2008 à 18:23
Bonjour Foxi,

merci beaucoup pour la traduction de la procedure.
Honnêtement, je n'y arrivais pas vraiment car je pèche beaucoup sur les pointeur et mes tentatives n'était pas concluante (en gros, ca ne compilait même pas).
Mais, je m'accroche :)

Je vais voir dans l'aide les déclaration de "const" et de "out" dans la déclaration des paramètres car je ne sais pas à quoi ça sert par rapport à une déclaration simple.

Oniria
0
Rejoignez-nous