web-dev-qa-db-fra.com

A quoi servent les instructions de rotation (ROL, RCL sur x86)?

Je me suis toujours demandé à quoi servent les instructions de rotation de certains processeurs (ROL, RCL sur x86, par exemple). Quel type de logiciel utilise ces instructions? J'ai d'abord pensé qu'elles pouvaient être utilisées pour le chiffrement/le calcul de codes de hachage, mais ces bibliothèques sont généralement écrites en C, qui n'a pas d'opérateur correspondant à ces instructions.
Quelqu'un a-t-il trouvé un emploi? Pourquoi ont-ils été ajoutés au jeu d'instructions?

25
Gratian Lup

Les rotations sont nécessaires pour les décalages entre bits de plusieurs mots. Lorsque vous scindez le mot inférieur, le bit de poids fort déborde dans le report. Pour terminer l'opération, vous devez décaler le (s) mot (s) le plus élevé (s) lors de l'introduction du report au bit de poids faible. RCL est l'instruction qui accomplit cela.

 Mot haut Mot bas Motif CF 
 Initiales 0110 1001 1011 1001 1100 0010 0000 1101? 
 SHL Mot bas 0110 1001 1011 1001 1000 0100 0001 1010 1 
 Mot haut RCL 1101 0011 0111 0011 1000 0100 0001 1010 1 

ROL et ROR sont utiles pour examiner une valeur bit par bit d'une manière (finalement) non destructive. Ils peuvent également être utilisés pour contourner un masque de bits sans apporter de déchets.

23
Nietzche-jou

Les codes d'opération de rotation (ROL, RCL, ROR, RCR) sont utilisés presque exclusivement pour les calculs de hachage et de CRC. Ils sont assez arcaniques et très rarement utilisés.

Les opcodes à décalage (SHL, SHR) sont utilisés pour une multiplication rapide par des puissances de 2 ou pour déplacer un octet bas dans un octet haut d'un grand registre.

La différence entre ROL et SHL est que ROL prend le bit le plus haut et le fait rouler dans la position du bit le plus bas. SHL jette le bit haut et remplit la position du bit bas avec zéro.

16
dthorpe

Les ROR ROL sont "historiques" mais restent utiles à plusieurs égards.

Avant le 80386 (et l'opcode BT), ROL serait beaucoup utilisé pour tester un bit (SHL ne se propage pas vers l'indicateur de portage). !

De même, si vous souhaitez effectuer un décalage dans les deux sens sans perdre les bits qui ont été décalés, vous devez utiliser ROR/ROL au lieu de SHR/SHL.

8
Alain Pannetier

Si je vous comprends bien, votre question est la suivante:

"Etant donné que les instructions de rotation semblent être très spéciales et non émises par les compilateurs, quand sont-elles réellement utilisées et pourquoi sont-elles incluses dans les CPU?".  

La réponse est double:

  1. Les CPU ne sont pas conçus spécifiquement pour exécuter des programmes C. Elles sont plutôt conçues comme des machines d'usage général, conçues pour résoudre un large éventail de problèmes à l'aide d'une grande variété d'outils et de langages différents.

  2. Les concepteurs d’un langage ne sont nullement tenus d’utiliser chaque code opération dans la CPU. En fait, la plupart du temps, ce n’est pas le cas, car certaines instructions de la CPU sont hautement spécialisées et que le concepteur de langage n’a aucun besoin urgent de les utiliser.

Pour plus d’informations sur les opérateurs au niveau des bits (et leur lien avec la programmation C), voir ici: http://en.wikipedia.org/wiki/Bitwise_operation

2
Robert Harvey

À l'époque de la création des microprocesseurs, la plupart des programmes étaient écrits dans Assembly, et non compilés. La plupart des instructions du processeur ne sont probablement pas émises par les compilateurs (ce qui est l’impulsion pour la création de RISC), mais sont souvent relativement faciles à implémenter dans le matériel.

De nombreux algorithmes graphiques et de cryptographie utilisent la rotation et leur inclusion dans les CPU permet d’écrire des algorithmes très rapides dans Assembly.

1
Gabe