2010-07-09 6 views
2

J'ai un morceau binaire de données de 512 octets de long, je me demandais quel serait le moyen le plus efficace si je voulais le déplacer une fois vers la droite. Ma meilleure estimation en ce moment (très nouveau à l'assemblage) serait que je devrais d'abord vérifier un morceau (probablement int) pour voir ce qu'il décalerait, déplacerait, puis porterait tout ce que l'int précédent aurait décalé sortir et continuer à transporter ce décalage vers le bas les données. Y a-t-il un moyen plus facile? Si je dois utiliser cette technique de transport, quel est le plus gros morceau que je peux changer? DWord? QWord?Grands décalages binaires dans l'assemblage 8086?

Répondre

2

Si vous voulez simplement changer une fois, utilisez les instructions de rotation. Tout d'abord, assurez-vous que le drapeau de report est zéro. Puis:

  1. Tirez 4 octets dans un registre
  2. RCR
  3. Ecrire arrière sur
  4. Répéter l'opération avec 4 octets suivants
1

Le déplacement sous x86 est très simple même pour les grandes structures de mémoire.

1) Définir ou effacer le drapeau de report dépend de ce que vous voulez en tant que premier bit (LSB) du résultat.

2) Il n'y a pas besoin d'extraire des données dans les registres que vous pouvez diriger 32bits changement à la fois dans la mémoire comme:

rcr  dword ptr[edx], 1 

ou mieux encore

rcr  dword ptr[edx + ecx *4], 1 

où ECX est un compteur de boucle et edx un pointeur de mémoire.

2) Magasin dernier décalé portent peu

EDIT: En mémoire, vous pouvez passer à la fois 32bits et ne pas oublier le Aligement mémoire, déplacer dwords 32bit aligend pour augmenter la vitesse d'exécution.