Question

J'ai une question fondamentale sur le montage.

Pourquoi si elles peuvent travailler sur la mémoire et donner la peine avons-nous faire des opérations arithmétiques que sur les registres?

Par exemple à la fois la cause suivante (essentiellement) à calculer la même valeur comme réponse:

Snippet 1

.data
    var dd 00000400h

.code

    Start:
        add var,0000000Bh
        mov eax,var
        ;breakpoint: var = 00000B04
    End Start

Snippet 2

.code

    Start:
        mov eax,00000400h
        add eax,0000000bh
        ;breakpoint: eax = 0000040B
    End Start


 D'après ce que je peux voir la plupart des textes et des didacticiels font la plupart du temps des opérations arithmétiques sur les registres. Est-il juste de travailler plus vite avec des registres?

Edit: C'était rapide:)

Quelques grandes réponses ont été données; meilleure réponse a été choisie en fonction de la première bonne réponse.

Était-ce utile?

La solution

Les registres sont beaucoup plus rapides et aussi les opérations que vous pouvez effectuer directement sur la mémoire sont beaucoup plus limitées.

Autres conseils

Si vous regardez les architectures informatiques, vous trouverez une série de niveaux de mémoire. Ceux qui sont proches de la CPU sont le jeûne, cher (par un peu), et donc faible, tandis qu'à l'autre extrémité, vous avez de gros, les dispositifs de mémoire lente et bon marché. Dans un ordinateur moderne, ceux-ci sont généralement quelque chose comme:

 CPU registers (slightly complicated, but in the order of 1KB per a core - there
                are different types of registers. You might have 16 64 bit
                general purpose registers plus a bunch of registers for special
                purposes)
 L1 cache (64KB per core)
 L2 cache (256KB per core)
 L3 cache (8MB)
 Main memory (8GB)
 HDD (1TB)
 The internet (big)

Au fil du temps, de plus en plus les niveaux de cache ont été ajoutés - Je me souviens d'un temps où les CPU n'avait pas de caches à bord, et je ne suis même pas vieux! Ces jours-ci, les disques durs sont livrés avec caches à bord, et l'Internet sont mises en cache dans un certain nombre d'endroits. En mémoire, sur le disque dur, et peut-être sur la mise en cache des serveurs proxy

Il y a un dramatique (souvent des ordres de grandeur) diminution bande passante et l'augmentation de latence dans chaque pas de la CPU. Par exemple, un disque dur est peut-être en mesure de lire à 100 Mo / s avec une latence de 5 ms (ces chiffres ne peuvent pas être tout à fait correct), alors que votre mémoire principale peut lire à 6.4GB / s avec une latence de 9ns (six ordres de ordre de grandeur!). Latence est un facteur très important, que vous ne voulez pas garder le CPU attendre plus longtemps qu'il doit (cela est particulièrement vrai pour les architectures avec pipelines profondes, mais qui est une discussion pour un autre jour).

L'idée est que vous serez souvent réutilisant les mêmes données et encore, il est donc logique de le mettre dans une petite cache rapide pour les opérations ultérieures. Ceci est appelé localité temporelle . Un autre principe important de la localité est localisation spatiale , qui dit que les emplacements de mémoire à proximité les uns des autres seront probablement lu à peu près en même temps. Il est pour cette raison que la lecture de la RAM provoquera un bloc beaucoup plus de RAM à lire et mis en cache sur CPU. S'il n'y avait pas ces principes de la localité, toute position dans la mémoire aurait une chance autant de chances d'être lu à un moment donné, il n'y aurait aucun moyen de prédire ce qui sera accessible à côté, et tous les niveaux de cache dans le monde ne va pas améliorer la vitesse. Vous pourriez tout aussi bien utiliser un disque dur, mais je suis sûr que vous savez ce qu'il est d'avoir l'ordinateur un coup d'arrêt de broyage lorsque la pagination (qui utilise essentiellement le disque dur comme une extension de la RAM). Il est théoriquement possible d'avoir de mémoire que pour un disque dur (et de nombreux petits appareils ont une seule mémoire), mais ce serait très lent par rapport à ce que nous connaissons.

Un autre avantage d'avoir des registres (et seulement un petit nombre de registres) est qu'il vous permet d'avoir instructions plus courtes . Si vous avez des instructions qui contiennent deux (ou plus) 64 adresses bits, vous allez avoir des instructions longues!

Les registres sont accessibles plus rapidement que la mémoire RAM façon , puisque vous ne disposez pas d'accès au bus mémoire "lent"!

x86, comme à peu près tous les autres CPU « normale » vous pourriez apprendre Assemblée, est un registre " machine ". Il existe d'autres façons de concevoir quelque chose que vous pouvez programmer (par exemple une machine de Turing qui se déplace le long d'une « bande » logique en mémoire), mais les machines enregistrer se sont révélés être fondamentalement la seule façon d'aller de haute performance.

Depuis x86 a été conçu pour utiliser les registres, vous ne pouvez pas vraiment les éviter tout à fait, même si vous vouliez et ne se soucient pas de la performance.

processeurs x86 actuels peuvent lire / écrire beaucoup plus registres par cycle d'horloge que les emplacements de mémoire.

Par exemple, Intel Skylake peut faire deux charges et un magasin de / à son 32kiB 8 voies cache L1D associatif par cycle (le meilleur des cas), mais peut lire plus de 10 registres par cycle d'horloge, et écrire 3 ou 4 (plus EFLAGS) .

Création d'un cache L1D avec autant de ports de lecture / écriture comme le fichier registre serait un coût prohibitif (en nombre transistor / zone et consommation d'énergie), surtout si vous voulez le garder aussi grand qu'il est. Il est probablement tout simplement pas physiquement possible de construire quelque chose qui peut utiliser la mémoire comme x86 utilise des registres avec les mêmes performances.

En outre, l'écriture d'un registre de lecture puis il a de nouveau essentiellement une latence nulle parce que le CPU détecte et transmet le résultat directement à partir de la sortie d'une unité d'exécution à l'entrée d'un autre, sans passer par l'étape de ré-écriture. (Voir https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Solution_A._Bypassing ).

Ces connexions résultat-transfert entre les unités d'exécution sont appelés le « réseau de by-pass » ou « réseau de transfert », et il est beaucoup plus facile pour le CPU de le faire pour une conception de registre que si tout devait aller dans la mémoire et revenir en arrière. L'unité centrale de traitement n'a plus qu'à vérifier 3 à 5 bits de numéro de registre, au lieu d'un 32 bits ou 64 bits adresse, pour détecter les cas où la sortie d'une instruction est nécessaire tout de suite que l'entrée pour une autre opération. (Et les numéros de registre sont codées en dur dans le code machine, ils sont donc disponibles tout de suite.)

Comme d'autres l'ont mentionné, 3 ou 4 bits pour traiter un registre font le format code machine beaucoup plus compact que si toutes les instructions avaient des adresses absolues.


Voir aussi https://en.wikipedia.org/wiki/Memory_hierarchy : vous peut penser des registres comme une petite rapide de taille fixe un espace mémoire séparé de la mémoire principale, où seulement diriger l'adressage absolu est pris en charge. (Vous ne pouvez pas « index » un registre. Donné un N entier dans un registre, vous ne pouvez pas obtenir le contenu du Nth inscrire à l'un insn)

Les registres sont également privé à un seul noyau CPU, donc hors de l'ordre d'exécution peut faire ce qu'il veut avec eux. Avec la mémoire, il a à se soucier de ce que les choses d'ordre deviennent visibles à d'autres cœurs de processeur.

Avoir un nombre fixe de registres fait partie de ce qui permet aux processeurs ne registre -renommant exécution dans le désordre. Avoir le registre numéro disponible immédiatement lorsqu'une instruction est décodé en fait également plus facile. Il n'y a jamais une lecture ou d'écriture à un registre non encore connu

Voir

Nous utilisons des registres parce qu'ils sont rapides. Habituellement, ils fonctionnent à la vitesse de CPU.
Registres et cache du processeur sont faites avec différentes technologies / tissus et
ils sont chers. RAM d'autre part ne coûte pas cher et 100 fois plus lent.

arithmétique registre D'une manière générale est beaucoup plus rapide et beaucoup préféré. Cependant, il y a des cas où l'arithmétique de mémoire directe est utile. Si tout ce que vous voulez faire est incrémenter un numéro en mémoire (et rien d'autre au moins pour quelques millions d'instructions), puis une seule instruction arithmétique mémoire directe est généralement un peu plus rapide que la charge / ajouter / magasin.

Aussi, si vous faites des opérations de tableau complexes dont vous avez besoin généralement beaucoup de registres pour garder la trace de l'endroit où vous êtes et où la fin de votre tableaux. Sur les architectures anciennes, vous pouvez manquer de registre très rapidement si la possibilité d'ajouter deux bits de mémoire ensemble sans zapper l'un de vos registres actuels était vraiment utile.

Oui, il est beaucoup beaucoup plus rapide d'utiliser les registres. Même si l'on considère que la distance physique du processeur à registre par rapport à proc à la mémoire, vous enregistrez beaucoup de temps par ne pas envoyer des électrons jusqu'à présent, et cela signifie que vous pouvez exécuter à une fréquence d'horloge supérieure.

Oui - vous pouvez également généralement pousser / registres pop facilement pour appeler les procédures, la gestion des interruptions, etc

Il est juste que le jeu d'instructions ne vous permettra pas de faire ces opérations complexes:

add [0x40001234],[0x40002234]

Vous devez passer par les registres.

scroll top