Question:
Optimisations du compilateur AMD64 avec des manipulations de registre
Modoc
2013-03-21 06:44:32 UTC
view on stackexchange narkive permalink

Les registres AMD64 (alias x86-64 ou x64) sont accessibles 8, 16, 32 ou 64 bits à la fois. Lors de la lecture d'une liste de désassemblage, quelles opérations de registre ne sont pas simples?

Par exemple, lorsqu'une instruction accède à une partie d'un registre, comment cela affecte-t-il d'autres parties?

Quelles instructions typiques ou les séquences d'instructions utilisées par les optimiseurs peuvent coder quelque chose qui n'est pas évident (par exemple, xoring un registre avec lui-même pour le mettre à zéro)?

Cette question est beaucoup trop large. Cela conduira à une liste d'anecdotes plutôt qu'à des réponses complètes. Il devrait être beaucoup plus ciblé, à tout le moins limité à un sujet particulier et de préférence à un compilateur ou une plate-forme particulier (par exemple, les manipulations de pile dans Visual C ++). Parce qu'il y a déjà eu [une réponse] (http://reverseengineering.stackexchange.com/a/111), j'ai proposé une modification qui se concentre sur le sujet de cette réponse: les manipulations de registre.
Merci pour la modification @Gilles. Je savais que la question était trop large quand je l'ai posée, mais je ne pouvais pas la reformuler d'une manière qui communiquait toujours ce que je voulais.
J'espère que la question aborde encore ce qui vous intéresse. Je vous encourage à poser une question distincte sur les manipulations de pile avec VC ++, j'aurais édité cette question pour me concentrer sur cela, mais j'ai pensé qu'il serait plus utile d'accommoder la réponse existante.
Un répondre:
#1
+10
Igor Skochinsky
2013-03-21 08:15:42 UTC
view on stackexchange narkive permalink

Ce n'est pas vraiment une optimisation, mais un truc dont vous devez être conscient lorsque vous venez de x86 est le suivant:

Toute opération sur un registre 32 bits met à zéro la moitié supérieure de celui de 64 bits

Par exemple, ce qui suit:

  mov eax, 3  

Est en fait équivalent à:

  mov rax, 3  

Ceci s'applique également aux nouveaux registres r8 - r15 , par exemple:

  inc r8d  

met également à zéro la moitié supérieure de r8.

Cependant , les parties 8 bits et 16 bits des registres ne fonctionnent pas comme ça, c'est-à-dire que les opérations sur eux ne modifient que cette partie du registre.



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...