Implémentation d'une fonction Delphi en assembleur
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 2016
-
14 mars 2010 à 12:31
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 2016
-
14 mars 2010 à 22:47
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) :
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 !
A voir également:
Implémentation d'une fonction Delphi en assembleur
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 14 mars 2010 à 22:47
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.