Question:
NOP instruction
Cream Cracker
2013-06-20 20:47:40 UTC
view on stackexchange narkive permalink

J'ai récemment appris que l'instruction nop est en fait xchg eax, eax ... ce qu'elle fait, c'est essentiellement échanger eax avec elle-même.

En ce qui concerne le processeur, l'échange a-t-il réellement lieu?

[À un moment donné, il l'a fait, et ce n'était plus un NOP] (http://www.pagetable.com/?p=6).
@DCoder Que voulez-vous dire?
Lisez la page à laquelle j'ai lié. Il y avait un bogue dans certains processeurs x64 d'AMD où `xchg EAX, EAX` était en fait exécuté ... [La plupart des instructions 32 bits en mode x64 mettent à zéro les 332 bits supérieurs de leurs opérandes] (http://stackoverflow.com/questions / 11177137 / why-do-most-x64-instructions-zero-the-upper-part-of-a-32-bit-register), et cette instruction l'a fait aussi.
@DCoder Qu'en est-il du 32 bits. Est-ce toujours d'actualité?
il n'a aucun effet sur 32 bits.
Deux réponses:
PSS
2013-06-20 21:09:02 UTC
view on stackexchange narkive permalink

Il existe plusieurs instructions qui peuvent être utilisées en fonction du compilateur. xchg eax, eax est le code d'octet 90. C'est une instruction légitime, qui prend un seul cycle de traitement. De plus, il existe plusieurs autres instructions, qui pourraient être utilisées à la place de xchg eax, eax :

  lea eax, [eax + 0x00] byte code 8D 40 00mov eax, eax byte code 89 C0  

Puisque toutes ces instructions ont des longueurs différentes, le compilateur choisit l'une des versions les plus appropriées en fonction des exigences d'alignement.

Concernant les choix des compilateurs, quelques pointeurs:

mais ils sont probablement moins "NOP-like" que le xchg. En outre, le NOP multi-octets documenté est l'ensemble "0f 1f / 0".
La seule autre instruction «nop» est «0F 1F / 0» qui est «NOP r / m16» et «NOP r / m32» sur les processeurs pris en charge. Cela peut prendre de 3 à 9 octets en x86-64, selon [Intel doc] (https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia -32-architectures-software-developer-instruction-set-reference-manual-325383.pdf) (page 4-163). Ainsi, même si vous pouvez utiliser `mov eax, eax` et d'autres comme une alternative, il présente un inconvénient par rapport au` nop` réel en ce qu'il bloque le pipeline du processeur et manque d'autres optimisations matérielles implémentées dans l'instruction `nop`.
David Hoelzer
2013-07-14 03:09:40 UTC
view on stackexchange narkive permalink

La réponse courte est "Oui". En fait, si vous expérimentez en générant directement des codes d'opération en langage machine, vous découvrirez qu'il existe toute une gamme d'opérations qui sont effectivement des NOP, qui nécessitent toutes un seul cycle de processeur pour s'exécuter.

Tant qu'elles sont pas techniquement "documenté", vous trouverez cela très proche du 0x90,

  • XCHG EAX, EAX
  • XCHG EBX EBX
  • XCHG ECX, ECX
  • XCHG EDX, EDX
Je ne pense pas que ce soit vrai. Je pense que les non-EAX prennent plus de cycles (3 et non 1) et je pense que toutes les versions XCHG 0 les 32 bits d'ordre supérieur sur un x86_64. https://stackoverflow.com/a/25053039/124486


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...