À quoi ressemble le code machine lors de son exécution?


21

Lorsque le code machine est réellement exécuté par le matériel et le CPU, à quoi ressemble-t-il?

Cela ressemblerait-il à du binaire, comme dans les instructions représentées par des uns et des zéros, ou serait-ce quelque chose composé de chiffres hexadécimaux où les opcodes sont des octets présentés comme des nombres hexadécimaux qui peuvent être décomposés en nombres binaires, comme le bytecode?


24
Ce que vous verriez, ce sont des fils, des portes et des registres vacillant sur le silicium. Par exemple, visual6502.org/JSSim
Nayuki

4
@Nayuki Je pense que cette visualisation est géniale et mérite d'être transformée en réponse!
nalzok

2
Ça ne me ressemble à rien
Gaius

3
Il n'existe même pas vraiment quand il est vraiment "exécuté". C'est "JIT compilé" par un périphérique (matériel!) Sur le CPU vers le microcode, qui instruit réellement le CPU!
xuq01

2
Une façon rapide de comprendre comment un ordinateur traduit est d'en construire une à partir de portes logiques, j'aime vraiment regarder celle faite par Ben Eater youtube.com/playlist?list=PLowKtXNTBypGqImE405J2565dvjafglHU
Ferrybig

Réponses:


38

La meilleure réponse que je puisse donner est qu'elle ne "ressemble" vraiment à rien. L'instruction en cours d'exécution par la CPU est représentée par une série de fils, dont certains ont une haute tension, dont certains ont une basse tension.

Vous pouvez interpréter les hautes et basses tensions comme des zéros et des uns, mais vous pouvez également interpréter des groupes de hautes et basses tensions comme des chiffres hexadécimaux ou comme une instruction d'assemblage comme ADD $0 $1(ce qui est le plus proche de la façon dont le CPU l'interprète). Ces chiffres et ces mnémoniques eux-mêmes sont des commodités pour les humains à lire; en interne, ce ne sont que des tensions sur les fils.

Parmi ces options, le binaire est "le plus proche du métal", dans la mesure où les zéros et les uns correspondent directement aux tensions hautes et basses sur les fils. Mais aucun des autres n'est incorrect, et ils sont souvent plus utiles: il y a une raison pour laquelle les gens regardent les vidages hexadécimaux d'exécutables, mais presque jamais les vidages binaires.


Alors, pourriez-vous ouvrir un programme dans un éditeur hexadécimal, et ces octets représentés en hexadécimal se traduisent-ils en code machine binaire qui peut être exécuté par une tension affectée à zéro et une tension affectée à un?
Tim Hardly

4
@TimHardly Yep! Hex est simplement plus facile à lire. L'assemblage, de même, est encore plus facile à lire, mais peut être traduit mécaniquement en zéros et en uns. C'est pourquoi les assembleurs sont plus faciles à écrire que les compilateurs.
Draconis

merci, toute cette question a élargi mes connaissances et dissipé ma confusion.
Tim Hardly

1
@TimHardly Un assembleur mappe simplement une séquence de caractères comme "NOP" à une série de bits comme "10010000", encore et encore, pour transformer un fichier d'assemblage en code machine. Les opcodes sont déterminés par le CPU, car c'est la partie qui va réellement les utiliser. Tous les ordinateurs qui peuvent exécuter les mêmes exécutables ont en effet le même ensemble d'opcodes; l'ensemble x86 est le plus courant et est utilisé dans à peu près tous les PC de nos jours. MIPS est un autre exemple courant, utilisé dans un certain nombre de consoles de jeux.
Draconis

1
@TimHardly Si votre question est, l'assembleur peut-il demander au CPU quel est son opcode pour l'instruction NOP, la réponse est non. L'assembleur doit déjà savoir quel octet afficher pour l'instruction avant de pouvoir fonctionner. En fait, un assembleur peut sortir un programme pour un processeur, tout en s'exécutant sur un type de processeur différent.
M. Lister

11

"Ressembler" implique une métaphore. Si nous prenons "à quoi cela ressemblera" littéralement, cela ressemblera à un morceau de silicium gravé de fantaisie assis sur sa carte mère. Le but était clairement la métaphore. Pour construire la métaphore, nous devons regarder ce que c'est vraiment en premier. Ensuite, nous pouvons construire une métaphore acceptable. C'est un peu long, mais heureusement, cela se termine par une métaphore vidéo pour vous.

Le code machine est en fait stocké en mémoire sous forme de bits. Les puces mémoire sont généralement des DRAM , qui stockent ces bits sous forme de tensions à travers un condensateur et des électrons. Les deux sont connectés - il est difficile de parler des tensions sans électrons. Parfois, c'est pratique de parler de l'un ou de l'autre, mais comprenez que là où l'un va, l'autre suit.

L'aventure du code machine commence par une «récupération». Un modèle particulier de tensions est appliqué aux fils de la puce RAM indiquant que cet ensemble particulier de bits doit être envoyé à la CPU. Pourquoi? Je ne sais pas, je m'en fiche. Généralement, ce signal est envoyé parce que le processeur a terminé la dernière instruction et en demande une nouvelle comme réponse instinctive, comme un chien qui demande une deuxième gâterie après que vous lui ayez donné la première. Ce processus commence par un coup de pied primordial dans le pantalon provoqué par une instabilité naturelle dans le CPU. Lorsqu'une alimentation applique une tension constante à la puce, les augmentations de tension conduisent finalement le CPU à mettre les bonnes tensions sur les puces RAM pour aller chercher les premières instructions (je fais un peu de la main sur la couche BIOS, car ce n'est pas important à l'histoire. Cherchez-le).

La mémoire moderne diffuse des données en parallèle. Cela signifie que les bits qui composent le code machine sont divisés en "voies" (32 ou 64 sont communes), ce qui est la façon logique de dire les fils 32/64 de la RAM à la CPU. La tension sur ces lignes est augmentée et abaissée selon les besoins pour la transmettre au CPU.

Une fois dans le CPU, il peut faire son travail. C'est le domaine de la microarchitecture , et cela peut se compliquer car il s'agit littéralement d'une industrie d'un milliard de dollars. Ces tensions affectent les transistors, qui affectent d'autres tensions, d'une manière que nous pourrions décrire comme «l'ajout de bits» ou la «multiplication». Ce ne sont vraiment que des tensions qui représentent ces bits, de la même manière que nous pourrions griffonner la chaîne de 5 caractères "2 + 2 = 4" sur un morceau de papier et dire que nous avons fait des mathématiques. Le crayon graphite n'est pas le numéro deux. C'est juste la représentation physique que nous utilisons pour ce nombre.

C'est donc ce que fait le vrai système, à un niveau extrêmement élevé. J'ai bien sauté ... à peu près tout ... mais c'est assez décent pour pouvoir revenir à votre vraie question. À quoi cela ressemblerait-il [métaphoriquement]?

En l'occurrence, je pense que Martin Molin a peut-être construit la meilleure métaphore, avec sa machine à marbre . Le code machine est codé (à la main) sur certaines bandes Lego Technics au milieu sous forme de chevilles, plutôt que de tensions sur un condensateur. Cela ressemble plus à EPROM qu'à DRAM, mais les deux contiennent des données. Les billes sont comme les électrons, étant déplacées par des tensions (ou gravité, dans le cas des billes). Et lorsque les électrons se déplacent, ils appliquent une force aux portes qui font les choses.

Sa machine est simple, comparée à un CPU moderne, mais ce n'est pas si mal, en ce qui concerne les métaphores. Et c'est accrocheur!


1
La machine à marbre est trop simple pour cela dans la vidéo. Un processeur a besoin d'un état.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen True. Je suppose que si la machine à marbre avait quelques portes qui lui permettaient de lancer les leviers automatiquement au lieu que Marin n'ait à les actionner, ce serait plus proche.
Cort Ammon - Rétablir Monica

Merci! Semblable à la question que j'avais posée sur la réponse ci-dessus, le code assemblé assemblé serait-il considéré comme du code machine qui est traduit en tensions et autres choses?
Tim Hardly

@TimHardly En utilisant les seules significations pour "assemblé", "Assemblage" et "Code machine", Le produit de l'assemblage Assemblage est défini comme étant du code machine (donc oui, il peut être considéré comme cela =)). Quelque chose qui pourrait aider est que l'assemblage et le code machine sont considérés comme des concepts "logiques", plus proches du concept mathématique de "2 + 2 = 4" et plus éloignés du graphite sur le papier sur lequel cette équation est écrite. Le code d'assemblage / machine est un code d'assemblage / machine, qu'il soit stocké sur un disque magnétique, écrit sur une feuille de papier ou stocké dans des condensateurs dans la DRAM.
Cort Ammon - Rétablir Monica

1
Si je peux être philosophique, le code machine est un code machine parce que nous le traitons comme un code machine. Nous le considérons comme un code machine. Je peux pointer un CPU vers les octets décrivant un son au format .wav, et il les exécutera en effet sous forme de code machine. Il est peu probable que l'exécution résultante fasse quelque chose d'utile (car le son n'a pas été construit pour être du code machine), et il peut s'arrêter, mais il pourrait être exécuté.
Cort Ammon - Rétablir Monica

10

Découvrez cette vidéo , en particulier de 1h00 à 1h17. C'est exactement à quoi cela ressemble quand un programme s'exécute sur un ordinateur. Les deux rangées de lumières indiquent le contenu actuel du registre d'adresses et du registre de données. Le PDP-11 n'a pas de registre d'instructions, mais s'il y en avait un et qu'il y avait des lumières sur le devant pour montrer son contenu, il aurait à peu près la même apparence. 16 lumières - certaines allumées, d'autres éteintes.

Si vous avez vraiment aimé les lumières clignotantes, vous pourriez avoir plus de lumières pour montrer le contenu actuel des six registres, le pointeur de pile, le compteur de programme ... pour 32768 lumières supplémentaires, vous pourriez avoir une lumière pour chaque bit du cache. Vous pourriez même avoir une lumière pour chaque morceau de mémoire ... mais ce serait vraiment beaucoup de lumières.

Il s'agit d'un PDP11-70 qui fonctionne à 15,2 MHz et chaque instruction prend environ 1,5 microsecondes à exécuter. L'œil humain peut détecter des changements jusqu'à 1/10 de seconde, et pendant ce temps, le PDP-11 peut exécuter 60 000 instructions. Fondamentalement, tout est flou.


Wow, c'est un bel exemple, j'en ai vu d'autres comme ça, quelque chose dans ce sens où vous pouvez voir des lumières et d'autres choses. youtube.com/watch?v=yOyaJXpAYZQ
Tim Hardly


6

Les concepteurs de matériel implémentant et testant (et testant et testant) le processeur utilisent réellement des modèles visuels pour voir ce que font leurs conceptions. La plupart (sinon la totalité) des outils de simulation HDL produisent des vues d'onde de tous les registres et fils pour permettre un débogage facile. La capture d'écran ci-dessous (prise à partir d' ici ) montre ces ondes du simulateur VCS pour un processeur RISC-V exécutant quelques instructions.

DVE Waves pour RISC-V

Il s'agit d'un exemple assez simple qui montre un petit sous-ensemble de la logique impliquée dans une conception de processeur complète. Vous pouvez ouvrir ces vues pour l'ensemble du processeur et regarder les données se propager à travers la logique. Si vous voulez voir le code machine s'exécuter, comme vous l'avez mentionné, vous pouvez regarder les vagues du registre d'instructions ou le bus que le processeur utilise pour lire les instructions en mémoire. La plupart des visualiseurs de vagues ont des options de visualisation flexibles pour les bus et les registres qui vous permettent d'afficher leurs valeurs sous forme d'étiquettes binaires, hexadécimales, octales et même enum. Dans certains, vous pouvez même définir vos propres fonctions pour mapper les modèles de bits sur les valeurs affichées.

Il convient de noter qu'il ne s'agit que d'une représentation d'une simulation du processeur. Il n'y a aucun moyen d'obtenir ce genre de vues pour une puce de processeur déjà fabriquée.


2

Imaginez un aveugle trébuchant dans une ruelle en construction. Partout où il y a des trous et des fissures, il devrait donc naturellement tomber. Pas cet aveugle, car il a un rouleau de papier avec des instructions, quand attendre, quand se déplacer, où se déplacer et comment manipuler son environnement pour atteindre la fin de la route. Voilà ce qu'est l'assemblage, une liste d'instructions aveuglément suivies - elles n'ont de sens que pour cette ruelle et pour cet aveugle. Vous pouvez en théorie même reconstruire un modèle 3D à partir des seules instructions (décompilation).

A chaque changement de plateforme, il est nécessaire de recompiler les instructions pour l'aveugle. Vous devez connaître le matériel (la disposition du chantier de construction), les instructions d'intention dactylographiées (code de haut niveau) comme "Je veux que vous sautiez par-dessus toutes les clôtures que vous rencontrez d'affilée jusqu'à ce que vous ayez 12 clôtures derrière vous" et le capacités des aveugles (CPU). A-t-il une mémoire à court terme, la capacité de faire plusieurs choses à la fois?

Prendre toutes ces informations et forger un scroll d'instructions cohérent est le travail du compilateur.

Puis-je décrire à quoi ressemble un programme? Non. Mais pouvons-nous décrire ce que cela ferait de l'exécuter? Oui, cela ressemblerait à un saut et à une course, comme des miroirs sans voir quelque chose, suivant une liste précise d'instructions, où que cela vous mène.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.