Pourquoi la rbp et la rsp appelés registres?
Selon Intel x64 les registres suivants sont appelés registres (RAX, RBX, RCX, RDX, RBP, RSI, RDI, le RPR et l'audi R8-R15) https://software.intel.com/en-us/articles/introduction-to-x64-assembly.
Dans l'article suivant, il est écrit que la RBP et la RSP sont à des fins spéciales registres (RBP point à la base de l'actuel cadre de la pile et la RSP pointer vers le haut de la stack frame).
https://www.recurse.com/blog/7-understanding-c-by-learning-assembly
Maintenant, j'ai deux déclarations contradictoires. Intel déclaration doit être de confiance, mais ce qui est correct et pourquoi est-RBP et la RSP appelé à usage général à tous ?
Merci pour toute aide.
Vous pouvez utiliser à la fois comme les registres, sens de l'habitude de l'arithmétique et logique instructions de travailler avec eux très bien.
Chaque registre a des-ness (sauf R8-R15), pour certaines instructions. Pour le RER, c'est spécial pour
Je suppose que si vous élargir la définition de "caractère spécifique" pour l'encodage, même
RBP peut être utilisé à des fins générales, avec
R11 a un rôle spécial pour syscall
rbp
est à peu près à usage général, le cadre, le pointeur de la chose, c'est juste de la convention.Chaque registre a des-ness (sauf R8-R15), pour certaines instructions. Pour le RER, c'est spécial pour
push
/pop
/call
/ret
, de sorte que la plupart de code n'utilise jamais pour rien. Mais dans le contrôle conditionnelle (pas comme les gestionnaires de signaux), vous n'avez pas pour l'utiliser pour un pointeur de pile. par exemple, vous pouvez l'utiliser pour lire un tableau dans une boucle avec pop
, comme dans ce code-golf réponse. (J'ai utilisé esp
dans le code 32 bits, mais même différence).Je suppose que si vous élargir la définition de "caractère spécifique" pour l'encodage, même
r13
est un peu spécial, mais elle n'est pas vraiment fonctionnel que vous pouvez toujours utiliser efficacement chaque mode d'adressage (même si l'assemblée est parfois mise caché dans un zéro de déplacement pour vous).RBP peut être utilisé à des fins générales, avec
-fomit-frame-pointer
. Il est plus difficile pour un reer si[R11 a un rôle spécial pour syscall
OriginalL'auteur Dennis | 2016-04-10
Vous devez vous connecter pour publier un commentaire.
Usage général signifie que l'ensemble de ces registres peut être utilisé avec toutes les instructions faire le calcul avec les registres, alors que, par exemple, vous ne pouvez pas faire ce que vous voulez avec le pointeur d'instruction (RIP) ou de l'historique des indicateurs (RFLAGS).
Certains de ces registres ont été envisagées pour être utilisé à des fins spécifiques, et souvent ils sont. Les plus importants sont le RSP et des RBP.
Si vous avez besoin de les utiliser pour votre propre usage, vous devez enregistrer leur contenu avant de les ranger quelque chose d'autre à l'intérieur, et les ramener à leur valeur d'origine lorsque vous avez terminé.
Il est furieux de noter que l'utilisation de
rpb
comme un pointeur de l'image est essentiellement entièrement convention et n'a pas vraiment de tout support CPU (en effet, les Windows 64 ABI vous permet d'utiliser tout le registre comme un pointeur de l'image et ne préfère pasrbp
). C'est très différent que dersp
qui est étroitement lié à sa fonction au niveau du matériel, car il est implicitement utilisé parpush
,pop
et amis.Le ENTRER et de sortir des instructions notamment l'appui à l'aide de la RBP comme un pointeur de l'image. RBP lorsqu'il est utilisé comme une base est également SS de la famille, comme les RER, plutôt que de DS de la famille, comme les autres. L'ENTRÉE d'instructions et de données séparée et segments de pile ne sont pas utilisés dans les modernes x86 code, mais les compilateurs génèrent encore LAISSER des instructions. Le fait que les RBP peut pas être utilisé comme une base sans déplacement signifie également que c'est normalement le meilleur de vous inscrire pour l'utiliser comme un pointeur de l'image. Ce n'est pas étroitement liés comme les RER, mais le jeu d'instructions x86 faveurs à l'aide de la RBP que le pointeur de cadre.
Oui, c'est toujours vrai, mais à peu près sans importance. IIRC, x86-64 exige de la SS et de la DS (et ES et CS) pour avoir la base=0. IDK ce que d'autres choses que vous pouvez mettre dans un descripteur de segment qui aurait de l'importance, dans certaines hypothèses de l'OS. Seulement FS et GS toujours plus ou moins une fonctionnalité complète.
Comme Peter Cordes dit, le SS segment est encore utilisé lors de la RBP et la RSP sont utilisés comme une base, mais il fait peu de différence dans la pratique. La seule différence, je sais, c'est qu'un non-canonique de l'adresse de générer une défaillance de pile au lieu de défaillance de protection générale si les SS segment est utilisé à la place de l'un des autres registres de segment.
OriginalL'auteur jlliagre
Si un registre peut être un opérande pour
add
, ou utilisé dans un mode d'adressage, c'est "généraliste", par opposition aux registres comme leFS
registre de segment, ou RIP. Le GP registres sont également appelés "entier registres", même si d'autres types de registres peuvent contenir des entiers, trop.Dans l'architecture d'un ordinateur, il est commun pour les Processeurs à gérer en interne entier registres /instructions séparément de FP/SIMD les registres ou les instructions. par exemple, Intel Sandybridge-famille de Processeurs ont séparé physique enregistrer des fichiers pour renommer GP entier vs FP/vecteur des registres. Ce sont simplement appelées entier vs FP enregistrer des fichiers. (Où FP est à court de main pour tout qu'un noyau n'a pas besoin de les sauvegarder/restaurer à utiliser le GP registres, tout en laissant de l'espace utilisateur du FPU/SIMD état intact.) Chaque entrée dans la FP fichier de registre est de 256 bits de large (pour garder un AVX ymm vecteur), mais entier registre des entrées de fichier ne doivent être 64 bits de large.
Sur des Processeurs renommer les registres de segment (Skylake ne pas), je suppose que ce serait une partie de l'entier de l'état, et qui seraient donc RFLAGS + RIP. Mais quand on dit "registre entier", nous avons l'habitude de dire spécifiquement à usage général pour vous inscrire.
Chaque registre a des-ness pour certaines instructions, sauf pour certains complètement nouveaux registres ajouté avec x86-64: R8-R15. Ce n'est pas le disqualifier comme Objectif Général La (faible 16 de la) 8 date de retour à 8086, et il y avait des utilisations implicites de chacun d'entre eux, même dans l'original 8086.
Pour un reer, c'est spécial pour le push/pop/appel/ret, de sorte que la plupart de code n'utilise jamais pour rien. (Et en mode noyau, utilisé de façon asynchrone pour les interruptions, de sorte que vous ne pouvez vraiment pas de cachette quelque part pour obtenir un supplément de GP enregistrer la façon dont vous pouvez dans l'espace utilisateur code: ESP comme usage général comme EAX?)
Mais contrôlés conditionnelle (pas comme les gestionnaires de signaux) vous n'avez pas à utiliser RSP pour un pointeur de pile. par exemple, vous pouvez l'utiliser pour lire un tableau dans une boucle avec de la pop, comme dans ce code-golf répondre. (J'ai utilisé
esp
dans le code 32 bits, mais même différence:pop
est plus rapide quelodsd
sur Skylake, alors que les deux sont de 1 octet.)Implicite utilise et spécial-ness pour chaque registre:
Voir aussi x86 Assemblée - Pourquoi est [e]bx conservés dans les conventions d'appel? pour une liste partielle.
Je suis la plupart du temps limiter ce droit à l'espace utilisateur des instructions, en particulier ceux d'un moderne compilateur peut effectivement émettre à partir de code C ou C++. Je ne cherche pas à être exhaustive pour les regs qui ont beaucoup d'utilisations implicites.
rax
: un opérande [i]mul /[i]div /cdq /cdqe, instructions de chaîne (stos),cmpxchg
, etc. etc. Ainsi que plus courte codages pour de nombreux immédiate des instructions comme 2 octetscmp al, 1
ou 5 octetsadd eax, 12345
(pas de ModRM octet). Voir aussi codegolf.SE Astuces pour jouer au golf en x86/x64 code machine.Il y a aussi
xchg
-avec-eax qui est l'endroit où0x90 nop
venu (avantnop
est devenu séparément documenté instruction x86-64, parce quexchg eax,eax
zéro s'étend eax dans RAX et ne peut donc pas utiliser le0x90
encodage. Maisxchg rax,rax
peut encore assembler à REX.W=1 0x90.)rcx
: maj compte,rep
-chaîne compte, la lenteur deboucle
enseignementrdx
:rdx:rax
est utilisé par se diviser et se multiplier, et la mdc /cdq /cqo de mettre en place pour eux.rdtsc
. BMI2mulx
.rbx
: 8086xlatb
.cpuid
utiliser tous les quatre de EAX..EDX. 486cmpxchg8b
, x86-64cmpxchg16b
. La plupart des 32 bits compilateurs émettentcmpxchg8
pourstd::atomic<long long>::compare_exchange_weak
. (Pure chargement /pure magasin peut utiliser ESS MOVQ ou x87 fild/fistp, bien que, si le ciblage Pentium ou plus tard.) 64-bit compilateurs utilisent 64 bitslock cmpxchg
, pas cmpxchg8b.Quelque 64 bits compilateurs émettent
cmpxchg16b
pouratomic<struct_16_bytes>
. RBX a le moins implicite utilise de l'original 8, maislock cmpxchg16b
est l'un des rares compilateurs utilisent réellement.rsi
/rdi
: string ops, y comprisrep movsb
dont certains compilateurs parfois en ligne. (gcc inlinesrep cmpsb
pour les littéraux de chaîne, dans certains cas, mais ce n'est probablement pas optimale).rbp
:leave
(seulement 1 uop plus lent quemov rsp, rbp
/pop rbp
. gcc utilise dans des fonctions avec un pointeur de l'image, quand il ne peut pas simplementpop rbp
). Aussi horriblement lententer
qui personne n'a jamais utilise.rsp
: pile ops: push/pop /appel/reg etleave
. (Etenter
). Et en mode noyau (pas d'espace utilisateur) asynchrone d'utilisation par le matériel pour enregistrer interrompre contexte. C'est pourquoi le code du noyau ne peut pas avoir de zone rouge.r11
:syscall
/sysret
l'utiliser pour sauvegarder/restaurer l'utilisateur de l'espace de RFLAGS. (Avec RCX pour sauvegarder/restaurer l'espace utilisateur du RIP).Adressage en mode de codage des cas particuliers:
(Voir aussi rbp ne sont pas autorisés dans le SIB de base? qui est juste à propos des modes d'adressage, où j'ai copié cette partie de cette réponse.)
rbp
/r13
ne peut pas être un registre de base sans déplacement: codage au lieu de cela signifie: (en ModRM)rel32
RIP (relatif), ou (en SIB)disp32
avec pas de registre de base. (r13
utilise les mêmes 3 bits dans ModRM/SIB, donc ce choix simplifie le décodage en ne faisant pas de l'instruction de longueur décodeur regarder le REX.B bits pour obtenir le 4e de la base de registre bits).[r13]
assemble pour[r13 + disp8=0]
.[r13+rdx]
assemble pour[rdx+r13]
(en évitant le problème par le remplacement de la base de/index lorsque c'est une option).rsp
/r12
comme un registre de base a toujours besoin d'un SIB octet. (Le ModR/M de codage de base=RSP est la fuite de code pour signaler un SIB octet, et de nouveau, plus de le décodeur serait à la charge sur le REX préfixe sir12
a été traitée différemment).rsp
ne peut pas être un indice de registre. Cela permet de coder[rsp]
, ce qui est plus utile que[rsp + rsp]
. (Intel pourrait avoir conçu le ModRM/SIB codages pour 32-bit modes d'adressage (386) donc SIB-avec-no-index n'a été possible avec la base=ESP. Que ferait[eax + esp*4]
possible et seulement exclure[esp + esp*1/2/4/8]
. Mais ce n'est pas utile, donc ils ont simplifié le matériel en faisant index=ESP le code pour no index, indépendamment de la base. Cela permet à deux redondant façons de coder toute la base ou de la base+disp mode d'adressage: avec ou sans SIB.)r12
peut être un indice de registre. Contrairement aux autres cas, cela n'affecte pas l'instruction de la longueur de décodage. Aussi, il ne peut pas être contourné avec une plus longue encodage comme les autres cas. AMD voulait AMD64 du registre à être orthogonale que possible, il est donc logique qu'ils allaient passer un peu plus de transistors pour vérifier REX.X dans le cadre de l'indice /indice de décodage. Par exemple,[rsp + r12*4]
nécessite index=r12, afin d'avoirr12
pas entièrement généralement but serait de faire un AMD64 pire compilateur cible.Compilateurs comme il lorsque tous les registres peut être utilisé pour quoi que ce soit, seulement limitent l'allocation de registres pour quelques cas spécial des opérations. C'est ce qui est signifié par le registre d'orthogonalité.
OriginalL'auteur Peter Cordes