2017-04-26 2 views
0

Si je déplace une valeur d'un registre 32 bits disent:Les valeurs 32 et 64 bits partagent-elles le même espace de registre?

movq %rdx,%rax 
    movl %edx,%eax 

Est-ce faussés la valeur stockée dans% rax?

+0

Oui, mais pas pour la raison que vous pensez. Tu aurais pu l'essayer aussi. – Jester

+0

Oui, bien sûr. C'est le même registre, peu importe si vous l'adressez en mode 8/16/32/64 bit. Voici un joli diagramme: http://stackoverflow.com/a/228367/14955 – Thilo

+0

@Jester "pas pour la raison pour laquelle vous pensez." S'il vous plaît élaborer. – Thilo

Répondre

2

Oui,

Votre code:

mov rax,rdx 
mov eax,edx 

effectuera les actions suivantes. L'attribution d'un registre de 32 bits mettra à zéro la partie supérieure de ce registre.

Contraste ceci:

mov rax,rdx : rax <= rdx 
mov ax,dx  : High 48 bits of rax is unchanged!, low 16 bits of rax <= dx 

va de même pour les registres d'octets. La raison pour laquelle 32 bits affectent la partie supérieure d'un registre à 64 bits est que cela empêche les mises à jour partielles du registre, ce qui provoque des retards dans le pipeline d'instructions.

En utilisant du code 16 bits en 32 ou 64 bits mode entraîne des retards dans le scénario suivant:

mov rax,-1  //1 cycle 
mov ax,dx  //1 cycle 
       //stall, the values of rax-upper and ax need to be combined 
mov r8,rax  //2 cycles 

Une meilleure option serait

mov rax,-1  //1 cycle 
movzx eax,dx  //runs concurrent with previous instruction, 0 cycles 
mov r8,rax  //1 cycle 

//Total 2 cycles, twice as fast. 

Ce code ne correspond pas à l'échantillon au-dessus , mais c'est tout le problème. Vous devriez éviter les mises à jour partielles du registre lorsque cela est possible. Notez également que movzx eax,dx est équivalent à movzx rax,dx pour les raisons indiquées ci-dessus. Sur x64 c'est un octet plus court et donc la forme préférée.

Notez que je ne suis pas en utilisant la syntaxe ATT, comme principe

+0

La "meilleure option" est en effet plus rapide , mais pas équivalent au code original causant le retard. Le 'movzx' rend le' mov 'initial complètement redondant. Aussi, que 'movzx' pourrait être écrit plus efficacement comme' movzx eax, dx' pour les raisons données dans la première moitié de cette réponse. –