2010-12-15 163 views
5

J'apprends actuellement l'ASM en désassemblant certains des codes C. Une chose me intéresse est que le compilateur gcc génère du code comme celui-ciQuel est le but de mov% rax,% rax?

movq %rax,%rax 

qui est évidemment dénué de sens. Alors, quel est le but de faire cela? Je me demande s'il est utilisé pour gaspiller quelques cycles de CPU afin d'améliorer le pipeline?

Merci pour votre indice!

+0

Il n'est pas utilisé pour améliorer le pipeline. Tous les processeurs x86 (pour des raisons historiques?) Ont un matériel qui résout ces risques en bloquant au besoin. Seuls les RISC, qui sont plus simples, ont besoin du support du compilateur. – ruslik

+1

@ruslik: un décrochage est lui-même un danger. –

Répondre

10

C'est fondamentalement un no-op, oui.

Le compilateur fait cela parce que le branchement à une adresse alignée sur une limite de 4 octets est plus rapide que le branchement à une adresse non alignée. Donc, si vous avez une boucle, le compilateur insérera "padding" juste avant le début afin de l'aligner.

+0

On dirait une explication raisonnable. Mais pourquoi ne pas utiliser l'instruction NOP? – xis

+4

x86 n'a pas d'instruction "dédiée" nop. L'instruction NOP 1 octet a l'opcode exact comme 'xchg% eax,% eax', et de même pour les autres tailles de nop. Le compilateur choisit un no-op avec la bonne taille pour la quantité de remplissage dont il a besoin. –

+5

Étant donné qu'une instruction NOP standard a une longueur de 1 octet et que le compilateur a besoin de 2 octets pour le remplissage. 1 instruction est plus rapide que 2, même si les deux sont des NOP. Par exemple, le NOP commun de 3 octets est 'lea edi, [edi + 0]' – ruslik