Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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.