2017-05-16 2 views
1

J'essaie de comprendre l'optimisation de l'assemblage x64 qui est faite par le compilateur.Que fait "nop dword ptr [rax + rax]" instruction d'assemblage x64 faire?

J'ai compilé un petit projet C++ comme Release construit avec Visual Studio 2008 SP1 IDE sur Windows 8.1.

Et l'une des lignes contenait le code assembleur suivant:

B8 31 00 00 00 mov   eax,31h 
0F 1F 44 00 00 nop   dword ptr [rax+rax] 

Et voici une capture d'écran:

enter image description here

Pour autant que je sais nop par lui-même est do nothing, mais je Je ne l'ai jamais vu avec un opérande comme ça.

Quelqu'un peut-il expliquer ce qu'il fait?

+4

Il s'agit d'un NOP multi-octets. La référence du jeu d'instructions explique ceci: http://www.felixcloutier.com/x86/NOP.html –

+0

@MichaelPetch: Merci. Juste curieux, quel est le but de l'ajout de cette instruction dans une version 'Release'? – c00000fd

+3

Habituellement pour l'alignement. souvent vous le verrez avant les boucles pour les aligner sur une limite de 16 ou 32 octets (16 est souvent un défaut). Cela peut améliorer les performances de la boucle. –

Répondre

0

Comme indiqué dans les commentaires, il s'agit d'un multi-byte NOP généralement utilisé pour aligner l'instruction suivante sur une limite de 16 octets, lorsque cette instruction est la première instruction dans une boucle. Un tel alignement peut aider avec l'instruction récupérer la bande passante, parce que la récupération d'instruction se produit souvent en unités de 16 octets, donc l'alignement du sommet d'une boucle donne la plus grande chance que le décodage se produise sans goulots d'étranglement.

L'importance d'un tel alignement est sans doute moins important que par le passé, avec l'introduction du tampon en boucle et le cache uop ​​ qui sont moins sensibles à l'alignement. Dans certains cas, cette optimisation peut même être une pessimisation, surtout lorsque la boucle s'exécute très peu de fois.