Implémentation d'une fonction Delphi en assembleur

Signaler
Messages postés
3792
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
-
Messages postés
3792
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
-
Salut à tous,
je désirerais implémenter la fonction suivante sur les registres MMX (afin de bénéficier du 64 bits, ce que ne gère pas Delphi nativement), avec la syntaxe Intel evidemment :

Var
 T: Int64;
begin
 H[$0] := (M[$0] + M[$1] + M[$2] + M[$3]) xor (H[$0] + H[$1] + H[$2] + H[$3]);

 with Int64Rec(H[$0]) do
  begin
   T := TRANSFORM[Bytes[$0]];    Inc(T, TRANSFORM[Bytes[$1]]);
   Inc(T, TRANSFORM[Bytes[$2]]); Inc(T, TRANSFORM[Bytes[$3]]);
   Inc(T, TRANSFORM[Bytes[$4]]); Inc(T, TRANSFORM[Bytes[$5]]);
   Inc(T, TRANSFORM[Bytes[$6]]); Inc(T, TRANSFORM[Bytes[$7]]);
  end;

 Inc(T, M[$0]);
 Inc(H[$1], T xor TRANSFORM[T and $FF]);
 Inc(T, M[$1]);
 Inc(H[$2], T xor TRANSFORM[T and $FF]);
 Inc(T, M[$2]);
 Inc(H[$3], T xor TRANSFORM[T and $FF]);
 Inc(T, M[$3]);
 Inc(H[$0], T xor TRANSFORM[T and $FF]);
end;


T est une variable 64 bits, M et H sont tous les deux des tableaux de 4 éléments sur 64 bits, TRANSFORM est un tableau de 256 éléments sur 64 bits, et Bytes désigne les huit octets dont est composé H[$0]. J'ai déjà trouvé pour la première ligne (si il y a moyen de faire plus simple je suis toute ouïe) :

asm
  MOVQ  MM0, [EDX + $00];
  PADDQ MM0, [EDX + $08];
  PADDQ MM0, [EDX + $10];
  PADDQ MM0, [EDX + $18];
  MOVQ  MM1, [EAX + $00];
  PADDQ MM1, [EAX + $08];
  PADDQ MM1, [EAX + $10];
  PADDQ MM1, [EAX + $18];
  PXOR  MM0, MM1;
  MOVQ  [EAX], MM0;
 end;


Mais je suis totalement bloqué avec tout ce qui concerne les accès variables à TRANSFORM. L'élément du tableau à utiliser dépend de la valeur de H[$0], et plus tard de T, et je ne vois pas comment passer ça en assembleur (MMX).

Merci de votre aide

Cordialement, Bacterius !

2 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
à quoi correspond Transform ?

un tableau de valeur prédéfinis ?

pourquoi on as pas le droit de voir la déclaration de la fonction, de H et M également ?
Messages postés
3792
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
Le tableau TRANSFORM contient juste des valeurs aleatoires, je peux les donner mais ca va faire gros ... Sinon H et M sont definis ainsi avec la fonction :

type
 THash = array [0..3] of Int64;

procedure Compress(var H: THash; const M: THash);


J'ai oublie de les donner, je les ai pas caches volontairement ...

PS : desole pour les accents je suis sur un pc anglais la.

Cordialement, Bacterius !