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?
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?
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:
Les opérations NOP x86 GAS (GNU Assembler, utilisé par GCC) peuvent être trouvées dans la fonction i386_align_code ()
de même, pour LLVM, il est dans X86AsmBackend :: writeNopData ()
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