web-dev-qa-db-fra.com

Quels sont les noms des nouveaux registres de processeurs X86_64?

Où puis-je trouver les noms des nouveaux registres pour Assembly sur cette architecture?

Je fais référence aux registres en X86 comme EAX, ESP, EBX, etc. Mais je les aimerais en 64 bits.

Je ne pense pas qu'ils soient les mêmes que lorsque je démonte mon code C, j'obtiens des r au lieu des e.

55
Recursion

Les anciens registres 32 bits ont été étendus à 64 bits, les registres r (rax, rbx, rsp et ainsi de suite).

En outre, il existe des registres à usage général supplémentaires r8 à travers r15 qui est également accessible en tant que (par exemple) r8d, r8w et r8b (le double mot 32 bits inférieur, le mot 16 bits et l'octet 8 bits respectivement). Le suffixe b est la nomenclature AMD d'origine, mais vous la verrez parfois écrite sous la forme l (minuscule L) pour "octet faible".

J'ai tendance à préférer le suffixe b moi-même (même si les registres d'octets bas actuels sont al, bl, etc.) car il correspond au d/w = double/Word noms et l pourraient potentiellement être confondus avec long. Ou pire, le chiffre 1, vous amenant à vous demander ce que le numéro de registre diable 81 est :-)

Les octets élevés des anciens registres 16 bits sont toujours accessibles, dans de nombreuses circonstances, comme ah, bh, etc. (bien que cela ne semble pas être le cas pour le nouveau r8 à travers r15 registres). Il y a de nouveaux encodages d'instructions , spécifiquement ceux utilisant le préfixe REX, qui ne peuvent pas accéder à ces octets élevés d'origine, mais d'autres sont toujours libre de les utiliser.

En outre, il existe de nouveaux registres SSE, xmm8 bien que xmm15.

Les registres eip et eflags ont également été étendus à rip et rflags (bien que les 32 bits les plus élevés de rflags le soient, pour l'instant , encore inutilisé).

Voir page wikipedia et MSDN pour plus de détails.

Que ceux-ci soient pris en charge dans le mot clé asm pour un compilateur C particulier, je ne pourrais pas le dire. Le peu d'Assemblée que je fais (et cela devient environ un jour par an) se fait en Assemblée plutôt qu'en C.


En relation:

72
paxdiablo

documentation MSDN contient des informations sur les registres x64.

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

Les 32 bits, 16 bits et 8 bits inférieurs 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 en langage assembleur pour les parties inférieures des registres 64 bits.

64-bit register | Lower 32 bits | Lower 16 bits | Lower 8 bits
==============================================================
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
94
RRUZ

X64 étend les registres à usage général 32 bits comme suit:

EAX -> RAX
EBX -> RBX
ECX -> RCX
EDX -> RDX
ESI -> RSI
EDI -> RDI
ESP -> RSP
EBP -> RBP

X64 ajoute également les registres à usage général 64 bits suivants:

R8, R9, R10, R11, R12, R13, R14, R15

De plus, SSE fait partie de la spécification X64, donc les registres vectoriels xmm0-xmm15 sont également disponibles

Vous pouvez trouver quelques informations de base sur l'architecture à Wikipedia/X86-64 ou allez sur le site Web d'Intel.

9
brainiac

Lisons le manuel d'Intel

Où puis-je trouver les noms des nouveaux registres pour Assembly sur cette architecture.

Dans le manuel du processeur "Intel 64 et IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture", par ex. version 253665-053US :

  • recherche de "registres"
  • la première correspondance est l'indice "3.4 REGISTRE D'EXÉCUTION DE PROGRAMME DE BASE"
  • deux éléments ci-dessous "3.4.1.1 Registres à usage général en mode 64 bits"

Sur cette section:

si une taille d'opérande 64 bits est spécifiée: RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8-R15 sont disponibles. Les R8D-R 15D/R8-R15 représentent huit nouveaux registres à usage général.

Rappel: le mode 64 bits est le mode "normal" en x86-64. L'autre mode principal est le "mode de compatibilité" qui émule IA32.

Si vous continuez à chercher "registre" sur la table des matières, vous trouverez également des sections sur les registres "écrasement de nombres" pour virgule flottante et SIMD dispersés dans le manuel:

  • 8.1.2 - Registres de données FPU x87 (STx)
  • 9.9.2 - Registres MMX
  • 10.2.2 - Registres XMM
  • 14.1.1 - Prise en charge du registre SIMD 256 bits large (YMM)

Il existe de nombreux autres registres de contrôle qui ont divers effets secondaires et ne peuvent généralement pas être écrits à moins que vous ne vouliez ces effets (et souvent nécessite l'anneau ). Celles-ci sont résumées dans le "Volume 3 System Programming Guide - 2.1.6 System Registers", qui est davantage destiné aux développeurs de systèmes d'exploitation.

Une bonne approche empirique consiste à exécuter info all-registers dans GDB: Comment imprimer les valeurs de registre dans GDB?