90 votes

Qu'est-ce que "rep; nop;" signifie en assemblage x86?

  • Qu'est - rep; nop moyenne?
  • Est-il le même que pause de l'enseignement?
  • Est-il le même que rep nop (sans le point-virgule)?
  • Quelle est la différence de la simple nop de l'enseignement?
  • T-il se comporter différemment sur les processeurs AMD et Intel?
  • (bonus) Où est la documentation officielle pour ces instructions?

La Motivation pour cette question

Après discussion dans les commentaires d' une autre question, j'ai réalisé que je ne sais pas ce qu' rep; nop; moyen en x86 (ou x86-64) de l'assemblée. Et aussi, je n'arrivais pas à trouver une bonne explication sur le web.

Je sais qu' rep est un préfixe qui signifie "répéter l'instruction suivante cx temps" (ou au moins, il était, dans le vieux-16-bit x86 assemblée). Selon ce tableau récapitulatif sur Wikipedia, il semble rep peut être utilisé uniquement avec movs, stos, cmps, lods, scas (mais peut-être que cette limitation a été supprimée sur les nouveaux processeurs). Donc, je pense que l' rep nop (sans point-virgule) serait répéter nop fonctionnement cx temps.

Cependant, après une recherche plus loin, je suis encore plus confus. Il semble qu' rep; nop et pause carte pour exactement les mêmes opcode, et pause a un peu un comportement différent de juste nop. Certains anciens messages à partir de 2005 dit des choses différentes:

  • "essayez de ne pas brûler trop de pouvoir"
  • "c'est l'équivalent de" nop " juste avec 2 codage octet."
  • "c'est de la magie sur intel. Ses comme 'nop, mais laisser les autres HT frère run'"
  • "c'est la pause sur les processeurs intel et rapide rembourrage sur les Athlon"

Avec ces différents avis, je ne pouvais pas comprendre la signification correcte.

Il est utilisé dans le noyau Linux (à la fois en i386 et x86_64), avec ce commentaire: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ Il est également utilisé dans BeRTOS, avec le même commentaire.

79voto

ughoavgfhw Points 28400

rep; nop est en effet le même que l' pause instruction (opcode F390). Il peut être utilisé pour les assembleurs qui ne prennent pas en charge l' pause instruction encore. Sur les précédents processeurs, c'était tout simplement n'a rien fait, tout comme nop mais sur deux octets. Sur les nouveaux processeurs de support de l'hyperthreading, il est utilisé comme un indice pour le processeur que vous êtes l'exécution d'une spinloop pour augmenter les performances. À partir d'Intel instruction de référence:

Améliore les performances de spin-attendre boucles. Lors de l'exécution d'un "spin-boucle d'attente," un Pentium 4 ou processeur Intel Xeon souffre d'une grave dégradation de la performance lors de la sortie de la boucle, car il détecte une mémoire afin de violation. La PAUSE instruction fournit un indice pour le processeur que la séquence de code est un spin-boucle d'attente. Le processeur utilise cette astuce pour éviter de la mémoire afin de violation dans la plupart des situations, ce qui améliore grandement les performances du processeur. Pour cette raison, il est recommandé de faire une PAUSE d'instruction être placé dans tous les spin-attendre boucles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X