Architecture x64

L’architecture x64 est une extension à compatibilité descendante de x86. Il fournit un nouveau mode 64 bits et un mode 32 bits hérité, qui est identique à x86.

Le terme « x64 » inclut à la fois AMD 64 et Intel64. Les jeux d’instructions sont presque identiques.

Registres

x64 étend les 8 registres à usage général de x86 à 64 bits et ajoute 8 nouveaux registres 64 bits. Les registres 64 bits ont des noms commençant par « r ». Par exemple, l’extension 64 bits d’eax est appelée rax. Les nouveaux registres sont nommés r8 à r15.

Les 32 bits inférieurs, 16 bits et 8 bits de chaque registre sont directement adressables dans les opérandes. Cela inclut les registres, comme esi, dont les 8 bits inférieurs n’étaient pas adressables auparavant. Le tableau suivant spécifie les noms de langage d’assembly pour les parties inférieures des registres 64 bits.

Registre 64 bits 32 bits inférieurs 16 bits inférieurs 8 bits inférieurs
Rax Eax ax al
Rbx Ebx Bx bl
rcx ecx Cx cI
rdx Edx Dx Dl
Rsi Esi si sil
Rdi Edi di Dil
Rbp Ebp bp bpl
Rer Esp sp Spl
r8 r8d r8w r8b
r9 r9d r9w r9b
r10 r10d r10w r10b
r11 r11d r11w r11b
r12 r12d r12w r12b
r13 r13d r13w r13b
r14 r14d r14w r14b
r15 r15d r15w r15b

Les opérations qui sortent vers une sous-inscription 32 bits sont automatiquement étendues à zéro à l’ensemble du registre 64 bits. Les opérations qui sortent vers des sous-inscriptions 8 bits ou 16 bits ne sont pas étendues à zéro (il s’agit du comportement x86 compatible).

Les 8 bits élevés de ax, bx, cx et dx sont toujours adressables comme ah, bh, ch, dh , mais ne peuvent pas être utilisés avec tous les types d’opérandes.

Le pointeur d’instruction eip et le registre des indicateurs ont été étendus à 64 bits (rip et rflags, respectivement).

Le processeur x64 fournit également plusieurs ensembles de registres à virgule flottante :

  • Huit registres x87 80 bits.

  • Huit registres MMX 64 bits. (Ces registres chevauchent les registres x87.)

  • L’ensemble d’origine de huit registres SSE 128 bits est porté à seize.

Conventions d’appel

Contrairement au x86, le compilateur C/C++ ne prend en charge qu’une seule convention d’appel sur x64. Cette convention d’appel tire parti de l’augmentation du nombre de registres disponibles sur x64 :

  • Les quatre premiers paramètres de pointeur ou d’entier sont passés dans les registres rcx, rdx, r8 et r9 .

  • Les quatre premiers paramètres à virgule flottante sont passés dans les quatre premiers registres SSE, xmm0-xmm3.

  • L’appelant réserve de l’espace sur la pile pour les arguments transmis dans les registres. La fonction appelée peut utiliser cet espace pour renverser le contenu des registres dans la pile.

  • Tous les arguments supplémentaires sont transmis sur la pile.

  • Une valeur de retour d’entier ou de pointeur est retournée dans le registre rax , tandis qu’une valeur de retour à virgule flottante est retournée dans xmm0.

  • rax, rcx, rdx, r8-r11 sont volatiles.

  • rbx, rbp, rdi, rsi, r12-r15 ne sont pas volatiles.

La convention d’appel pour C++ est similaire. Ce pointeur est passé en tant que premier paramètre implicite. Les trois paramètres suivants sont transmis dans les registres restants, tandis que les autres sont transmis sur la pile.

Modes d’adressage

Les modes d’adressage en mode 64 bits sont similaires, mais pas identiques à x86.

  • Les instructions qui font référence aux registres 64 bits sont automatiquement exécutées avec une précision 64 bits. Par exemple, mov rax, [rbx] déplace 8 octets à partir de rbx dans rax.

  • Une forme spéciale de l’instruction mov a été ajoutée pour les constantes immédiates 64 bits ou les adresses constantes. Pour toutes les autres instructions, les constantes immédiates ou les adresses constantes sont toujours de 32 bits.

  • x64 fournit un nouveau mode d’adressage relatif à l’extraction. Les instructions qui font référence à une adresse constante unique sont encodées en tant que décalages par rapport à l’extraction. Par exemple, l’instruction mov rax, [addr] déplace 8 octets à partir del’extraction de l’addeur + vers rax.

Les instructions, telles que jmp, call, push et pop, qui font implicitement référence au pointeur d’instruction et au pointeur de pile les traitent comme des registres de 64 bits sur x64.

Voir aussi