Skip to content

Glossary

Registres R8-R15

R8 à R15 sont les huit registres généraux 64 bits étendus de x86-64 ajoutés par AMD64, pour le passage d'arguments et l'espace de travail supplémentaire.

R8–R15 sont les huit registres généraux qu'AMD64 a ajoutés au fichier de registres x86 d'origine, doublant leur nombre de huit à seize. Ils n'ont pas de mnémoniques historiques — ils sont simplement numérotés — et n'existent qu'en mode 64 bits, encodés via le préfixe REX. Disposer de huit registres supplémentaires réduit considérablement le déversement sur la pile par rapport au code 32 bits.

Dans les conventions d'appel, ils transportent des arguments. La System V AMD64 ABI utilise R8 et R9 comme cinquième et sixième arguments entiers/pointeurs (après RDI, RSI, RDX, RCX) ; R10R15 ne sont pas des registres d'arguments. La Microsoft x64 ABI utilise R8 et R9 comme troisième et quatrième arguments. La répartition de la volatilité diffère selon l'ABI :

  • System V : R8R11 sont sauvegardés par l'appelant (volatils) ; R12R15 sont sauvegardés par l'appelé.
  • Microsoft x64 : R8R11 sont sauvegardés par l'appelant ; R12R15 sont sauvegardés par l'appelé. (R10/R11 sont des registres de travail/thunk.)

Sous-registres

Chacun utilise un schéma de nommage à suffixe numérique plutôt que les anciens noms :

asm
mov r8,  rax     ; 64 bits complet
mov r8d, eax     ; 32 bits de poids faible (met à zéro la moitié haute)
mov r8w, ax      ; 16 bits de poids faible
mov r8b, al      ; 8 bits de poids faible

Pourquoi c'est important en rétro-ingénierie

Repérer R8/R9 positionnés avant un call signale le cinquième/sixième argument sous Linux ou le troisième/quatrième sous Windows. Une fonction qui sauvegarde R12R15 dans son prologue conserve des valeurs à longue durée de vie à travers les appels. Comme ces registres exigent le préfixe REX, leur présence est en soi un signal rapide indiquant que vous regardez du véritable code 64 bits.

Voir le concept général de registre et la référence assembleur. Le fichier de registres étendu est un sujet déterminant dans assembleur x86 vs x64. Ils poursuivent la séquence d'arguments qui commence avec le registre RDI.