Partager via


Architecture x64

L’architecture x64 est une extension compatible descendante de x86 qui fournit un nouveau mode 64 bits et un mode 32 bits hérité identique à x86. Cette architecture étend les huit registres à usage général de x86 à 64 bits, ajoute huit nouveaux registres et introduit des conventions d’appel améliorées et des modes d’adressage pour la programmation 64 bits moderne.

Le terme « x64 » inclut AMD64 et Intel 64. Les jeux d’instructions sont presque identiques.

Registres

x64 étend les huit registres à usage général de x86 à 64 bits et ajoute huit 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. Cette adressabilité directe inclut des registres comme esi, dont les 8 bits inférieurs n’étaient pas adressables précédemment. 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 Les 16 bits de moindre poids Les 8 bits inférieurs
rax eax ax al
rbx ebx bx bl
rcx ecx cx cl
rdx edx dx dl
rsi esi si sil
rdi edi di dil
rbp ebp bp bpl
rsp 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 génèrent une sous-inscription 32 bits s’étendent automatiquement à l’ensemble du registre 64 bits. Les opérations qui produisent une sortie vers des sous-registres de 8 bits ou de 16 bits ne s'étendent pas avec des zéros (ce comportement est compatible avec x86).

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

Les registres eip et registre des indicateurs sont é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 se chevauchent avec les registres x87.)

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

Conventions d’appel

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

  • Les quatre premiers paramètres d’entier ou de pointeur 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 déverser le contenu des registres dans la pile.

  • Vous transmettez d’autres arguments 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 sont nonvolatiles.

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 passés dans les registres restants, tandis que le reste est 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 s’exécutent automatiquement avec une précision 64 bits. Par exemple, mov rax, [rbx] déplace 8 octets commençant à rbx en rax.

  • Une forme spéciale de l’instruction mov existe 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 au registre RIP. Instructions qui font référence à une adresse constante unique se codent comme des décalages par rapport à rip. Par exemple, l’instruction mov rax, [addr] déplace 8 octets à partir deaddr + rip vers rax.

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 64 bits sur x64.