Comment une instruction d’assemblage se transforme-t-elle en changements de tension sur le processeur?

Je travaille en C et CPython depuis 3 à 5 ans. Considère que ma base de connaissance ici.

Si je devais utiliser une instruction d’assemblage telle que MOV AL, 61h sur un processeur qui la supportait, quel est exactement le processeur qui interprète ce code et le dissortingbue sous forme de signaux de tension? Comment une instruction aussi simple serait-elle susceptible d’être réalisée?

Assembly se sent même comme un langage de haut niveau lorsque j’essaie de penser à la multitude d’étapes contenues dans MOV AL, 61h ou même XOR EAX, EBX .

EDIT: J’ai lu quelques commentaires demandant pourquoi j’ai mis cela comme intégré lorsque la famille x86 n’est pas courante dans les systèmes embarqués. Bienvenue dans ma propre ignorance. Maintenant, je pense que si j’ignore cela, il y a probablement d’autres ignorants.

Il m’a été difficile de choisir une réponse préférée compte tenu des efforts que vous avez tous consacrés à vos réponses, mais je me suis senti obligé de prendre une décision. Pas de sentiments blessés, les gars.

Je trouve souvent que plus je découvre les ordinateurs, moins je me rends compte que je sais réellement. Merci de m’avoir ouvert à la logique des microcodes et des transistors!

EDIT # 2: Grâce à ce thread, je viens de comprendre pourquoi XOR EAX, EAX est plus rapide que MOV EAX, 0h . 🙂

J’ai récemment commencé à lire le livre de Charles Petzold intitulé Code, qui couvre jusqu’à présent exactement le genre de choses qui, je suppose, vous intéressent. Mais je ne suis pas parvenu à travers le livre avant d’acheter / d’emprunter.

Ceci est ma réponse relativement courte, pas Petzolds … et, espérons-le, conforme à ce que vous étiez curieux.

Vous avez entendu parler du transistor que je suppose. La manière originale d’utiliser un transistor était pour des choses comme une radio à transistor. c’est un amplificateur à la base, prenez le tout petit signal radio qui flotte dans l’air et introduisez-le dans l’entrée du transistor qui ouvre ou ferme le stream de courant sur un circuit adjacent. Et vous connectez ce circuit avec une puissance plus élevée, vous pouvez donc prendre un très petit signal, l’amplifier et l’insérer dans un haut-parleur par exemple et écouter la station de radio (il ya plus à isoler la fréquence et à maintenir le transistor équilibré, mais vous obtenez l’idée que j’espère).

Maintenant que le transistor existe, il est possible d’utiliser un transistor comme commutateur, comme un interrupteur. La radio est comme un variateur de lumière que vous pouvez allumer ou éteindre. Un interrupteur d’éclairage non gradateur est allumé ou éteint, il y a un endroit magique au milieu de l’interrupteur où il change. Nous utilisons des transistors de la même manière en électronique numérique. Prenez la sortie d’un transistor et insérez-la dans une autre entrée de transistors. La sortie du premier n’est certainement pas un petit signal comme l’onde radio, il force le deuxième transistor à fond ou complètement. cela conduit au concept de logique TTL ou transistor-transistor. Fondamentalement, vous avez un transistor qui alimente une haute tension ou permet de l’appeler un 1, et sur qui coule une tension nulle, appelons cela un 0. Et vous arrangez les entrées avec d’autres appareils électroniques afin que vous puissiez créer des portes ET (si les deux entrées sont un 1 alors la sortie est un 1), OU portes (si l’une ou l’autre des entrées est un 1 alors la sortie est un). Onduleurs, NAND, portes, portes NOR (un ou avec un onduleur), etc. Il existait un manuel TTL et vous pouviez acheter une dizaine de puces contenant une ou deux ou quatre portes (NAND, NOR, AND, etc) fonctionne à l’intérieur, deux entrées et une sortie pour chacun. Maintenant, nous n’avons pas besoin de ceux-ci, il est moins coûteux de créer une logique programmable ou des puces dédiées avec plusieurs millions de transistors. Mais nous pensons toujours en termes de portes AND, OR et NOT pour la conception du matériel. (généralement plus comme nand et ni).

Je ne sais pas ce qu’ils enseignent maintenant mais le concept est le même, pour la mémoire une bascule peut être considérée comme deux de ces paires TTL (NANDS) liées ensemble à la sortie de l’une allant à l’entrée de l’autre. Laissez-le à cela. C’est fondamentalement un seul bit dans ce que nous appelons SRAM, ou ram statique. sram prend essentiellement 4 transistors. Dram ou dynamic ram les barrettes de mémoire que vous mettez dans votre ordinateur prennent un transistor par bit, donc pour les débutants, vous pouvez voir pourquoi dram est la chose que vous achetez des gigaoctets. Les bits Sram se souviennent de ce que vous leur avez défini tant que le courant ne s’éteint pas. Dram commence à oublier ce que vous lui avez dit dès que vous le dites, fondamentalement, le dram utilise le transistor d’une manière différente, il y a une certaine capacité (comme dans le condensateur, ça ne rentrera pas ici), comme une petite batterie rechargeable, dès que vous le chargez et détwigz le chargeur, il commence à se vider. Pensez à une rangée de lunettes sur une étagère avec de petits trous dans chaque verre, ce sont vos pièces de dram, vous voulez que certaines d’entre elles soient de la sorte vous avez un assistant pour remplir les lunettes que vous voulez être. Cet assistant doit constamment remplir le pichet et descendre le rang et garder les verres “un” pleins d’eau et laisser les verres “zéro” restr vides. Donc, à tout moment, vous voulez voir quelles sont vos données, vous pouvez regarder et lire les uns et les zéros en recherchant des niveaux d’eau nettement supérieurs à la moyenne et des niveaux nettement inférieurs à la moyenne étant un zéro. Lorsque l’assistant est sous tension, si l’assistant n’est pas capable de garder les lunettes suffisamment pleines pour indiquer qu’il est à zéro, elles finiront toutes par apparaître comme des zéros et s’épuiseront. C’est le compromis pour plus de bits par puce. Donc, la petite histoire ici est que, en dehors du processeur, nous utilisons dram pour notre mémoire de masse, et il y a une logique auxiliaire qui prend soin de garder les uns un zéro et un zéro. Mais à l’intérieur de la puce, le registre AX et les registres DS, par exemple, conservent vos données à l’aide de tongs ou de sram. Et pour chaque bit que vous connaissez comme les bits du registre AX, il y a probablement des centaines ou des milliers ou plus qui sont utilisés pour obtenir et extraire les bits de ce registre AX.

Vous savez que les processeurs fonctionnent à une vitesse d’horloge, ces jours-ci autour de 2 gigahertz ou deux milliards d’horloges par seconde. Pensez à l’horloge, qui est générée par un cristal, à un autre sujet, mais la logique considère cette horloge comme une tension élevée et nulle haute et nulle à cette fréquence 2ghz ou autre (les avances gameboy sont 17mhz, les anciens ipods 75mhz, original ibm pc 4.77mhz).

Ainsi, les transistors utilisés comme commutateurs nous permettent de prendre de la tension et de les transformer en un et zéros que nous connaissons à la fois en tant qu’ingénieurs et ingénieurs logiciels et vont jusqu’à nous donner des fonctions logiques AND, OR et NOT. Et nous avons ces cristaux magiques qui nous permettent d’obtenir une oscillation de tension précise.

Donc, nous pouvons maintenant faire des choses comme dire, si l’horloge est un, et que ma variable d’état dit que je suis dans l’état d’instruction, alors je dois changer certaines portes pour que l’adresse de l’instruction que je veux, compteur de programme, sort sur le bus mémoire, de sorte que la logique de mémoire peut me donner mes instructions pour MOV AL, 61h. Vous pouvez rechercher ceci dans un manuel x86 et constater que certains de ces bits d’opcode disent qu’il s’agit d’une opération mov et que la cible est les 8 bits inférieurs du registre EAX, et que la source du mov est une valeur immédiate se trouve dans l’emplacement mémoire après cette instruction. Nous devons donc enregistrer cette instruction / code opération quelque part et récupérer le prochain emplacement mémoire au prochain cycle d’horloge. nous avons donc sauvé le mov al, immédiat et nous avons la valeur 61h lue dans la mémoire et nous pouvons changer la logique du transistor de sorte que le bit 0 de ce 61h soit stocké dans la bascule du bit 0 de al et bit 1 au bit 1, etc. .

Comment tout cela se passe-t-il? Pensez à une fonction python effectuant une formule mathématique. vous commencez en haut du programme avec des entrées dans la formule qui entrent en tant que variables, vous avez des étapes individuelles dans le programme qui peuvent append une constante ici ou appeler la fonction racine carrée d’une bibliothèque, etc. renvoie la réponse. La logique matérielle est la même, et les langages de programmation actuels en sont un. La principale différence réside dans le fait que vos fonctions matérielles peuvent contenir des centaines ou des milliers d’entrées et que la sortie est un seul bit. A chaque cycle d’horloge, le bit 0 du registre AL est calculé avec un algorithme énorme, en fonction de la distance que vous souhaitez parcourir. Pensez à cette fonction racine carrée que vous avez appelée pour votre opération mathématique, cette fonction elle-même est l’une de celles dont certaines entrées produisent une sortie, et peut appeler d’autres fonctions une multiplication ou une division. Donc, vous avez probablement un peu quelque part que vous pouvez considérer comme la dernière étape avant le bit 0 du registre AL et sa fonction est la suivante: si l’horloge est une, alors AL [0] = AL_next [0]; sinon AL [0] = AL [0]; Mais il y a une fonction plus élevée qui contient ce prochain bit calculé à partir d’autres entrées, et une fonction plus élevée et une fonction supérieure et beaucoup d’entre elles sont créées par le compilateur de la même manière que vos trois lignes de python de lignes d’assembleur. Quelques lignes de HDL peuvent devenir des centaines ou des milliers ou plus de transistors. Les utilisateurs de matériel ne consultent normalement pas la formule de niveau le plus bas d’un bit particulier pour trouver toutes les entrées possibles et tous les ET, OR et NOT possibles pour le calcul, plus que vous inspectez probablement l’assembleur généré par vos programmes. mais tu pourrais si tu le voulais.

Une note sur le microcodage, la plupart des processeurs n’utilisent pas de microcodage. par exemple, vous obtenez le x86 parce que c’était un bon jeu d’instructions pour son époque, mais en surface il a du mal à suivre les temps modernes. d’autres jeux d’instructions n’ont pas besoin de microcodage et utilisent la logique directement de la manière décrite ci-dessus. Vous pouvez penser à un microcodage en tant que processeur différent utilisant un langage d’instructions / d’assemblage différent qui émule le jeu d’instructions que vous voyez à la surface. Pas aussi compliqué que lorsque vous essayez d’émuler des fenêtres sur un Mac ou Linux sur Windows, etc. La couche de microcodage est conçue spécifiquement pour le travail, vous pouvez penser qu’il n’y a que les quatre registres AX, BX, CX, DX, mais sont beaucoup plus à l’intérieur. Et naturellement, un programme d’assemblage peut en quelque sorte être exécuté sur plusieurs chemins d’exécution dans un cœur ou plusieurs cœurs. Tout comme le processeur de votre réveil ou de votre lave-linge, le programme du microcode est simple et petit, débogué et gravé dans le matériel, ne nécessitant probablement aucune mise à jour du microprogramme. Au moins idéalement. mais comme votre ipod ou votre téléphone par exemple, vous voulez parfois un correctif ou autre et il existe un moyen de mettre à niveau votre processeur (le bios ou un autre logiciel charge un correctif au démarrage). Supposons que vous ouvriez le compartiment de la batterie sur votre télécommande ou votre calculasortingce, vous pourriez voir un trou où vous pouvez voir des contacts nus dans une rangée, peut-être trois, cinq ou plus. Pour certaines télécommandes et calculasortingces, si vous le vouliez vraiment, vous pourriez le reprogrammer, mettre à jour le firmware. Normalement, cependant, cette télécommande est parfaite ou parfaite pour survivre au téléviseur. Le microcodage offre la possibilité d’obtenir le produit très complexe (des millions, des centaines de millions de transistors) sur le marché et de réparer les gros bogues réparables sur le terrain. Imaginez un programme Python de 200 millions de lignes que votre équipe a écrit, par exemple 18 mois, et que le produit ou la société échouera dans le produit de la compétition. Même chose, à part une petite partie du code que vous pouvez mettre à jour sur le terrain, le rest doit restr gravé dans la pierre. pour le réveil ou le grid-pain, s’il y a un bug ou si la chose a besoin d’aide, il suffit de la jeter et d’en obtenir une autre.

Si vous parcourez wikipedia ou tout simplement des choses sur Google, vous pouvez consulter les jeux d’instructions et le langage machine pour des choses comme le 6502, le z80, le 8080 et d’autres processeurs. Il peut y avoir 8 registres et 250 instructions et vous pouvez avoir une idée du nombre de transistors que 250 instructions d’assemblage restnt un langage de très haut niveau par rapport à la séquence de portes logiques nécessaire pour calculer chaque bit dans une bascule par horloge. cycle. Vous avez raison dans cette hypothèse. À l’exception des processeurs à microcodage, cette logique de bas niveau n’est en aucun cas reprogrammable, vous devez corriger les bogues matériels avec un logiciel (pour les matériels livrés ou non mis au rebut).

Regardez ce livre de Petzold, il fait un excellent travail en expliquant des choses, de loin supérieur à tout ce que je pourrais jamais écrire.