Wie sieht der Maschinencode während der Ausführung aus?

21

Wie sieht es aus, wenn Maschinencode tatsächlich von Hardware und CPU ausgeführt wird?

Würde es wie binär aussehen, wenn Anweisungen durch Einsen und Nullen dargestellt werden, oder bestünde es aus hexadezimalen Ziffern, bei denen Opcodes Bytes sind, die als Hexadezimalzahlen dargestellt werden und in Binärzahlen wie Bytecode zerlegt werden können?

Tim Kaum
quelle
24
Was Sie sehen würden, sind Drähte, Tore und Register, die auf dem Silizium flackern. Beispiel: visual6502.org/JSSim
Nayuki
4
@Nayuki Ich finde diese Visualisierung großartig und verdient es, zu einer Antwort gemacht zu werden!
Nalzok
2
Für mich sieht es nach nichts aus
Gaius
3
Es existiert nicht einmal, wenn es wirklich "ausgeführt" wird. Es ist "JIT kompiliert" von einem (Hardware!) Gerät auf der CPU zum Mikrocode, der die CPU tatsächlich anweist!
XUQ01
2
Eine schnelle Möglichkeit zu verstehen , wie ein Computer übersetzt baut eine von Logikgattern, ich wirklich mag gerade die man gemacht von Ben Esser youtube.com/playlist?list=PLowKtXNTBypGqImE405J2565dvjafglHU
Ferrybig

Antworten:

38

Die beste Antwort, die ich geben kann, ist, dass es nicht wirklich wie irgendetwas "aussieht". Der Befehl, der gegenwärtig von der CPU ausgeführt wird, wird durch eine Reihe von Drähten dargestellt, von denen einige eine hohe Spannung haben, von denen einige eine niedrige Spannung haben.

Sie können die hohen und niedrigen Spannungen als Nullen und Einsen interpretieren, aber Sie können Gruppen von hohen und niedrigen Spannungen genauso gut als hexadezimale Ziffern interpretieren oder als Montageanweisung ADD $0 $1(die der Interpretation durch die CPU am nächsten kommt). Diese Zahlen und Mnemoniken sind für den Menschen einfach zu lesen. Intern sind es nur Spannungen an den Drähten.

Von diesen Optionen ist Binär "dem Metall am nächsten", da die Nullen und Einsen direkt den hohen und niedrigen Spannungen an den Drähten zugeordnet werden. Aber keiner der anderen ist falsch und sie sind häufig nützlicher: Es gibt einen Grund, warum die Leute Hex-Dumps von ausführbaren Dateien betrachten, aber fast nie Binär-Dumps.

Draconis
quelle
Könnten Sie also ein Programm in einem Hex-Editor öffnen und die in Hex dargestellten Bytes in Maschinencode-Binärdaten umwandeln, die von einer Spannung, die Null zugewiesen ist, und einer Spannung, die Eins zugewiesen ist, verarbeitet werden können?
Tim Hardly
4
@ TimHardly Yep! Hex ist einfach leichter zu lesen. Assemblierung ist in ähnlicher Weise noch einfacher zu lesen, kann jedoch mechanisch in Nullen und Einsen übersetzt werden. Das ist der Grund, warum Assembler einfacher zu schreiben sind als Compiler.
Draconis
danke, diese ganze frage hat mein wissen erweitert und meine verwirrung beseitigt.
Tim Hardly
1
@TimHardly Ein Assembler ordnet eine Folge von Zeichen wie "NOP" immer wieder einer Reihe von Bits wie "10010000" zu, um eine Assembly-Datei in Maschinencode umzuwandeln. Die Opcodes werden von der CPU bestimmt, da dies der Teil ist, der sie tatsächlich verwenden wird. Alle Computer, auf denen dieselben ausführbaren Dateien ausgeführt werden können, verfügen in der Tat über dieselben Opcodes. Das x86-Set ist das gebräuchlichste und wird heutzutage in fast allen PCs verwendet. Ein weiteres verbreitetes ist MIPS, das in einer Reihe von Spielekonsolen verwendet wird.
Draconis
1
@TimHardly Wenn Ihre Frage lautet: Kann der Assembler die CPU nach dem Opcode für den NOP-Befehl fragen, lautet die Antwort "Nein". Der Assembler muss bereits wissen, welches Byte für die Anweisung ausgegeben werden soll, bevor er arbeiten kann. Tatsächlich kann ein Assembler ein Programm für einen Prozessor ausgeben, während er selbst auf einem anderen Prozessortyp läuft.
Mr Lister
11

"Look like" impliziert eine Metapher. Wenn wir "wie wird es aussehen" wörtlich nehmen, wird es aussehen wie ein ausgefallenes geätztes Stück Silikon, das auf seiner Hauptplatine sitzt. Offensichtlich war Metapher das Ziel. Um die Metapher zu erstellen, müssen wir uns zuerst ansehen, was es wirklich ist. Dann können wir eine Metapher aufbauen, die akzeptabel ist. Das ist ein bisschen lang, aber zum Glück, es endet mit einem Video Metapher für Sie.

Der Maschinencode wird tatsächlich als Bits gespeichert. Speicherchips sind typischerweise DRAMs , die diese Bits als Spannungen über einem Kondensator und Elektronen speichern. Die beiden sind verbunden - es ist schwer, über die Spannungen ohne die Elektronen zu sprechen. Manchmal ist es praktisch, über das eine oder andere zu sprechen, aber verstehen Sie, dass das andere folgt, wohin es geht.

Die Reise des Maschinencodes beginnt mit einem "Abruf". An die Drähte des RAM-Chips wird ein bestimmtes Spannungsmuster angelegt, das angibt, dass dieser bestimmte Satz von Bits an die CPU gesendet werden soll. Warum? Weiß nicht, ist mir egal. In der Regel wird dieses Signal gesendet, weil die CPU die letzte Anweisung beendet hat und instinktiv nach einer neuen Anweisung fragt, wie z. B. ein Hund, der nach der ersten Anweisung nach einer zweiten Behandlung fragt. Dieser Prozess beginnt mit einem anfänglichen Tritt in die Hose, der durch eine natürliche Instabilität der CPU verursacht wird. Wenn ein Netzteil eine konstante Spannung an den Chip anlegt, führt der Spannungsanstieg schließlich dazu, dass die CPU die richtigen Spannungen an die RAM-Chips anlegt, um die ersten Anweisungen zu erhalten (ich bewege die BIOS-Ebene ein wenig mit der Hand, da dies nicht wichtig ist zur Geschichte.

In modernen Speichern werden Daten parallel übertragen. Dies bedeutet, dass die Bits, aus denen der Maschinencode besteht, in "Lanes" aufgeteilt werden (32 oder 64 sind gemeinsam). Dies ist die logische Art und Weise, die 32/64-Drähte vom RAM zur CPU auszudrücken. Die Spannung auf diesen Leitungen wird nach Bedarf angehoben und abgesenkt, um sie in die CPU zu übertragen.

Sobald es in der CPU ist, kann es seine Arbeit machen. Dies ist der Bereich der Mikroarchitektur , und es kann kompliziert werden, da dies buchstäblich eine Milliarden-Dollar-Industrie ist. Diese Spannungen beeinflussen Transistoren, die andere Spannungen beeinflussen, auf eine Weise, die wir als "Addieren von Bits" oder "Multiplizieren" bezeichnen könnten. Das sind eigentlich alles nur Spannungen, die diese Bits repräsentieren, genauso wie wir die 5-stellige Zeichenfolge "2 + 2 = 4" auf ein Blatt Papier schreiben und sagen, wir hätten Mathematik gemacht. Der Bleistift Graphit ist nicht die Nummer zwei. Es ist nur die physikalische Darstellung, die wir für diese Nummer verwenden.

Genau das leistet das reale System auf enorm hohem Niveau. Ich habe gut übersprungen ... so ziemlich alles ... aber es ist anständig genug, um auf deine eigentliche Frage zurückkommen zu können. Wie würde es [metaphorisch] aussehen?

Ich glaube, Martin Molin hat mit seiner Marble Machine die beste Metapher geschaffen . Der Maschinencode wird (von Hand) auf einige Lego Technics-Streifen in der Mitte als Stifte codiert, nicht auf Spannungen an einem Kondensator. Dies ähnelt eher einem EPROM als einem DRAM, jedoch enthalten beide Daten. Die Murmeln sind wie die Elektronen, die durch Spannungen (oder im Fall von Murmeln durch die Schwerkraft) bewegt werden. Und während sich die Elektronen bewegen, üben sie Kraft auf Tore aus, die Dinge tun.

Seine Maschine ist einfach im Vergleich zu einer modernen CPU, aber es ist nicht so schlimm, was Metaphern angeht. Und es ist eingängig!

Cort Ammon - Setzen Sie Monica wieder ein
quelle
1
Dafür ist die Marmormaschine im Video zu einfach. Eine CPU braucht Zustand.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen Richtig. Ich nehme an, wenn die Marmormaschine ein paar Tore hätte, die es ihr ermöglichen würden, die Hebel automatisch zu betätigen, anstatt dass Marin sie umlegen müsste, wäre es näher.
Cort Ammon - Reinstate Monica
Vielen Dank! Ähnlich wie bei der Frage, die ich in der obigen Antwort gestellt hatte: Wird zusammengesetzter Assembly-Code als Maschinencode betrachtet, der in Spannungen und Dinge übersetzt wird?
Tim Hardly
@TimHardly Unter Verwendung der einzigen Bedeutungen für "montiert", "Baugruppe" und "Maschinencode" wird das Produkt der Montage von Baugruppen als Maschinencode definiert (also kann dies als = betrachtet werden). Etwas, das helfen könnte, ist, dass sowohl Baugruppen- als auch Maschinencode als "logische" Konzepte betrachtet werden, näher am mathematischen Konzept von "2 + 2 = 4" und weiter vom Graphit auf dem Papier, auf dem diese Gleichung geschrieben ist. Baugruppen- / Maschinencode ist Baugruppen- / Maschinencode, unabhängig davon, ob er auf einer Magnetplatte gespeichert, auf ein Stück Papier geschrieben oder in Kondensatoren im DRAM gespeichert ist.
Cort Ammon - Reinstate Monica
1
Wenn ich philosophisch werden darf, ist Maschinencode Maschinencode, weil wir ihn wie Maschinencode behandeln. Wir betrachten es als Maschinencode. Ich kann eine CPU auf die Bytes verweisen, die einen Sound im WAV-Format beschreiben, und sie werden tatsächlich als Maschinencode ausgeführt. Die resultierende Ausführung wird wahrscheinlich nichts Sinnvolles bewirken (da der Sound nicht als Maschinencode konstruiert wurde), und sie wird möglicherweise angehalten, kann jedoch ausgeführt werden.
Cort Ammon - Reinstate Monica
10

Schauen Sie sich dieses Video an , insbesondere 1:00 bis 1:17. Genau so sieht es aus, wenn ein Programm auf einem Computer ausgeführt wird. Die beiden Leuchtzeilen zeigen den aktuellen Inhalt des Adressregisters und des Datenregisters. Der PDP-11 hat kein Anweisungsregister, aber wenn es eines gäbe und es auf der Vorderseite Lichter gäbe, die den Inhalt anzeigen, würde es ziemlich gleich aussehen. 16 Lichter - einige an, einige aus.

Wenn Sie Blinklichter wirklich mögen, könnten Sie mehr Lichter haben, um den aktuellen Inhalt der sechs Register, des Stapelzeigers, des Programmzählers ... für weitere 32768 Lichter könnten Sie ein Licht für jedes Bit des Cache haben. Sie könnten sogar ein Licht für jedes bisschen Gedächtnis haben ... aber das wäre wirklich eine Menge Licht.

Dies ist ein PDP11-70, der mit 15,2 MHz ausgeführt wird. Die Ausführung jedes Befehls dauert etwa 1,5 Mikrosekunden. Das menschliche Auge kann Änderungen bis zu 1/10 Sekunde erkennen, und in dieser Zeit kann der PDP-11 60.000 Anweisungen ausführen. Grundsätzlich ist alles eine Unschärfe.

JavaLatte
quelle
Wow, das ist ein schönes Beispiel, ich habe schon andere gesehen, etwas in dieser Richtung, wo man Lichter und andere Dinge sehen kann. youtube.com/watch?v=yOyaJXpAYZQ
Tim Hardly
6

Die Hardware-Designer, die den Prozessor implementieren und testen (und testen und testen), verwenden tatsächlich visuelle Modelle, um zu sehen, was ihre Designs tun. Die meisten (wenn nicht alle) HDL-Simulationstools geben Wave-Ansichten aller Register und Drähte aus, um ein einfaches Debuggen zu ermöglichen. Der folgende Screenshot (von hier aus aufgenommen ) zeigt diese Wellen des VCS-Simulators für einen RISC-V-Prozessor, auf dem einige Anweisungen ausgeführt werden.

DVE-Wellen für RISC-V

Dies ist ein recht einfaches Beispiel, das einen kleinen Teil der Logik eines vollständigen Prozessordesigns zeigt. Sie können diese Ansichten für den gesamten Prozessor öffnen und beobachten, wie sich die Daten durch die Logik ausbreiten. Wenn Sie möchten, dass der Maschinencode wie erwähnt ausgeführt wird, können Sie in den Wellen nach dem Befehlsregister oder dem Bus suchen, mit dem der Prozessor die Befehle aus dem Speicher liest. Die meisten Wave-Viewer verfügen über flexible Anzeigeoptionen für Busse und Register, mit denen Sie ihre Werte als binäre, hexadezimale, oktale und sogar als Aufzählungsbezeichnungen anzeigen können. In einigen Fällen können Sie sogar Ihre eigenen Funktionen für die Zuordnung von Bitmustern zu angezeigten Werten definieren.

Es ist erwähnenswert, dass dies nur eine Darstellung einer Simulation des Prozessors ist. Es gibt keine Möglichkeit, diese Art von Ansichten für einen bereits hergestellten Prozessorchip zu erhalten.

jtst
quelle
2

Stellen Sie sich einen blinden Mann vor, der in einer im Bau befindlichen Gasse stolpert. Überall gibt es Löcher und Risse, also sollte er natürlich fallen. Nicht dieser Blinde, denn er hat eine Schriftrolle mit Anweisungen, wann er warten muss, wann er sich bewegen muss, wohin er sich bewegen muss und wie er seine Umgebung manipulieren muss, um das Ende der Straße zu erreichen. Das ist, was Versammlung ist, eine blind befolgte Liste von Anweisungen - sie sind nur für diese Gasse und für diesen blinden Mann sinnvoll. Sie können theoretisch sogar ein 3D-Modell allein aus den Anweisungen rekonstruieren (Dekompilieren).

Bei jeder Änderung der Plattform müssen die Anweisungen für den Blinden neu kompiliert werden. Sie müssen die Hardware (das Layout der Baustelle), die vom Menschen eingegebenen Absichtsanweisungen (High Level Code) wie "Ich möchte, dass Sie über alle Zäune springen, denen Sie hintereinander begegnen, bis Sie 12 Zäune hinter sich haben" und den Code kennen Fähigkeiten der Blinden (CPU). Hat er Kurzzeitgedächtnis, die Fähigkeit, mehrere Dinge gleichzeitig zu tun?

Alle diese Informationen zu sammeln und eine zusammenhängende Anweisungsliste zu erstellen, ist Aufgabe des Compilers.

Kann ich beschreiben, wie ein Programm aussieht? Aber können wir beschreiben, wie es sich anfühlt, es auszuführen? Ja, es würde sich wie ein Sprung anfühlen, wie ein Spiegel, ohne etwas zu sehen, und einer genauen Liste von Anweisungen folgen, wohin es Sie auch führen mag.

Pica
quelle