Wie genau gehen wir von Binary / Hex zu Assembly Instruction Sets?

13

Also habe ich in letzter Zeit versucht, ein bisschen Embedded / Assembly-Programmierung zu lernen, und auch versucht, das unterste Level (Gates und so weiter) zu erlernen.

Eine Sache verwundert mich allerdings ... wie wir Befehlssätze "bekommen". Ich verstehe ein wenig, wie Gates / TTL und solche funktionieren, aber ich verstehe nicht, wie wir davon zu mov, add, clr etc ... kommen.

Es ist wahrscheinlich eine blöde Frage ... aber ich meine, ich denke zurück zu den ersten Mikroprozessoren / Controllern und denke ... wie genau haben sie einen Befehlssatz entworfen und ihn funktionieren lassen?

edit: Ich schätze für Klarheit, tu so, als würde ich über den ersten Mikroprozessor sprechen, wie sind sie von Binary zum Erstellen eines Befehlssatzes gekommen?


quelle
2
Jede Anweisung hat einen Wert. Der Compiler konvertiert Ihren Code in diese Anweisungen, je nachdem, wie Ihr Code aufgebaut ist.
Ramhound
1
Ich bin mir nicht sicher, ob ich Ihre Frage richtig verstehe, aber ich denke, Sie können Ihre Antwort hier , hier oder hier finden .
e-MEE
3
Wie sind sie von Binary zum Erstellen eines Befehlssatzes gekommen? Eigentlich haben "sie" es nicht getan - zumindest im Allgemeinen ist es umgekehrt. Die CPU-Designer bestimmen die Operationen, die die CPU ausführen wird, dann erstellen sie daraus den Befehlssatz und ordnen die Befehle (Mnemonics) den Opcodes (Binärmaschinencode) zu. @Scott Whitlock hat unten eine gute Antwort geliefert. Ich wollte nur den letzten Teil Ihrer Frage ansprechen, da Ihre Annahme, zumindest nach meiner Erfahrung, rückständig ist.
Radian
1
Dieses wirklich schöne Buch: www1.idc.ac.il/tecs hat mir alles erklärt, die meisten Kapitel sind kostenlos online verfügbar. Sie entwerfen Ihren eigenen Chip (in einer einfachen Hardwarebeschreibungssprache) aus nand Gates, dann einem Assembler, dann einem Compiler und schreiben dann ein OS in der Sprache, die Sie erstellt haben! Erstaunliches Zeug, und als jemand ohne akademischen Abschluss war es für mich eine gute Zeit!
bplus

Antworten:

18

Das Herzstück einer CPU ist die ALU . Es ist dafür verantwortlich, eine Anweisung (wie MOV), die nur eine vordefinierte Folge von Binärziffern ist, sowie 0, 1 oder 2 Operanden zu übernehmen und die entsprechende Operation für diese auszuführen. Die einfachste Anweisung könnte eine NOP (keine Operation) sein, die im Wesentlichen nichts bewirkt. Eine andere typische Operation ist ADD (addiert zwei Werte).

Die ALU liest und schreibt Daten aus und in "Register". Dies sind kleine Speicherplätze innerhalb der CPU. Ein Teil des Befehls (2 bis 3 Bits für jeden Eingang, je nachdem, wie viele Register Sie haben) gibt an, aus welchem ​​Register gelesen werden soll. Es gibt Einheiten in der CPU außerhalb der ALU, die das Laden der erforderlichen Daten (und der Anweisung) aus dem Speicher in die Register und das Zurückschreiben des Ergebnisses aus den Registern in den Speicher handhaben. Der Ort, an dem das Ergebnis geschrieben werden soll, wird ebenfalls in zwei oder drei weitere Bits codiert.

Die Auswahl von "Operationscodes", bei denen es sich um die Binärzahl handelt, die eine Operation darstellt, ist nicht willkürlich. Gut gewählte Opcodes reduzieren die Komplexität der ALU. Jedes Bit oder jede Gruppe von Bits tendiert dazu, ein bestimmtes Logikgatter in der ALU zu aktivieren und zu deaktivieren. Zum Beispiel müsste ein ADD-Befehl die Ausgangsstufe in die Lage versetzen, das Ergebnis der internen Additionslogik zu wählen. Ebenso würde ein MUL-Befehl das Ergebnis der Multiplikationslogik auswählen. Abhängig vom Design ist es sehr wahrscheinlich, dass sowohl die Addier- als auch die Multiplizierschaltung ihre Operation tatsächlich an den Eingangsoperanden ausführen, und es ändert sich nur die Ausgangsauswahl (was in die Ausgangsbits der ALU geschrieben wird).

Scott Whitlock
quelle
1
Ich vermute, was ich frage, ist, wie sie wählen? Und wie ordnen sie es tatsächlich zu?
1
@ Sauron: Lesen Sie den dritten Absatz noch einmal und versuchen Sie, binäre arithmetische und digitale Schaltungen zu verstehen. Ich kann einen Befehlssatz mit 256 Befehlen über eine 8-Bit-Leitung in einer digitalen Schaltung darstellen. Das bedeutet, dass ich 8 io-Ports auf meinen Hardwaregeräten benötige, um jeden möglichen Status zu übertragen (2 Status pro Zeile ^ 8 Status = 256 mögliche Status). Die Verarbeitungseinheit kann dann entscheiden, was mit diesem digitalen Eingangssignal zu tun ist. Eine digitale Schaltung bedeutet, dass Sie zwei Hardwarezustände haben: Hi und Lo, Spannung oder keine Spannung. Daher kommt die Binärdatei. Die binäre Darstellung ist diejenige, die dem Metall am nächsten liegt.
Falcon
3
@Sauron - Nachschlagen von Digital-Multiplexern, um zu sehen, wie ein digitaler Schaltkreis aus mehreren Werten auswählen kann. Wenn Sie einen 8-Bit-Bus haben, benötigen Sie nur 8 dieser binären digitalen Multiplexer parallel.
Scott Whitlock
1
@ Falcon Ok ....... ich finde das sinnvoller. Ich vergesse immer wieder, dass am Ende alles auf Binärsignale hinausläuft ... und sogar Befehle wie "mov" werden immer noch als Binärsignale dargestellt.
1
@Sauron - Machen Sie einige Nachforschungen über die CPU, damit Sie verstehen, was Op-Codes sind und wie sie funktionieren. Warum bestimmte Op-Codes gewählt werden, ist nicht wichtig, selbst wenn man die "Warum" -Frage stellt, ergibt das keinen Sinn. Wenn Sie wissen, wie sie ausgewählt wurden, können Sie möglicherweise mehr über die CPU und ihre Struktur erfahren.
Ramhound
9

Ich werde Ihre Frage wörtlich nehmen und hauptsächlich auf Mikroprozessoren eingehen, nicht auf Computer im Allgemeinen.

Alle Computer haben eine Art Maschinencode. Eine Anweisung besteht aus einem Opcode und einem oder mehreren Operanden. Beispielsweise wurde der ADD-Befehl für den Intel 4004 (den allerersten Mikroprozessor) als 1000RRRR codiert, wobei 1000 der Operationscode für ADD ist und RRRR eine Registernummer 0-15 darstellt (client1111 in binär).

Alle anderen Befehle, die auf eines der 16 4-Bit-Register verweisen (wie z. B. INC, ISZ, LD, SUB, XCHG), verwenden ebenfalls die niedrigen 4-Bits, um die Registernummer zu codieren, und verschiedene Codierungen der oberen 4-Bits, um sie anzugeben der Opcode. Beispielsweise verwenden ADD, SUB, LD und XCHG die Operationscodes 1000, 1001, 1010 und 1011 (alle in Binärform) in Kombination mit dem Registerfeld. So können Sie sehen, wie ein Muster verwendet wird, um die Logik zu vereinfachen.

Die allerersten Computerprogramme wurden von Hand geschrieben, wobei die Einsen und Nullen von Hand codiert wurden, um ein Programm in Maschinensprache zu erstellen. Dies wurde dann in einen ROM (Nur-Lese-Speicher) programmiert. In der Regel werden Programme jetzt bei Mikrocontrollern in einen elektrisch löschbaren Flash-Speicher geschrieben, bei Mikroprozessoren geht der Arbeitsspeicher aus. (Letzterer benötigt zum Booten noch einen Nur-Lese-Speicher.)

Die Maschinensprache wird sehr schnell langweilig, daher wurden Assembler-Programme entwickelt, die eine mnemonische Assemblersprache verwenden und diese, normalerweise eine Zeile Assembler-Code pro Anweisung, in Maschinencode übersetzen. Anstelle von 10000001 würde man also ADD R1 schreiben.

Aber der allererste Assembler musste in Maschinencode geschrieben werden. Dann könnte es in seinem eigenen Assembler-Code umgeschrieben und die maschinensprachliche Version verwendet werden, um es das erste Mal zusammenzusetzen. Danach könnte sich das Programm selbst zusammenstellen (dies wird Bootstrapping genannt).

Da der erste Mikroprozessor lange nach dem Bestehen von Großrechnern und Minicomputern entwickelt wurde und der 4004 ohnehin nicht für die Ausführung eines Assemblers geeignet war, hat Intel wahrscheinlich einen Cross-Assembler geschrieben, der auf einem seiner großen Computer ausgeführt und den Assembler-Code für übersetzt wurde die 4004 in ein binäres Abbild, das in die ROMs programmiert werden könnte.

Tcrosley
quelle
4

Ein Computer auf einer sehr niedrigen Ebene kann durch einen Datenpfad und eine Steuerung dargestellt werden . Wenn Sie diese zusammen googeln, können Sie viel lesen, da dies für die digitale Architektur / das digitale Design von grundlegender Bedeutung ist.

Ich werde mein Bestes tun, um zusammenzufassen:

Wie hier erwähnt, haben wir im Kern eine ALU - was über die ALU (und andere Teile der CPU) bekannt sein muss, ist, dass sie für verschiedene Operationen umkonfigurierbar ist. Insbesondere können wir den Datenpfad neu konfigurieren. Dabei handelt es sich um die Art und Weise , wie Parameter abgerufen werden, welche Operation ausgeführt werden soll und wo sie anschließend gespeichert werden. Stellen Sie sich vor, Sie könnten diese drei Dinge manipulieren - das ist unsere Kontrolle .

Wie erreichen wir das? Wie bereits erwähnt, können wir die digitale Logik auf niedriger Ebene nutzen und Multiplexer für verschiedene Pfade erstellen. Multiplexer werden mit einer Reihe von Bits für die Eingabe gesteuert. Woher stammen diese Bits? Kodiert aus den Anweisungen selbst. Zum Mitnehmen: Anweisungen wie mov, add usw. sind nur ein Satz von Bits, die einer CPU mitteilen, wie ihr Datenpfad für eine bestimmte Operation konfiguriert werden soll. Was Sie lesen (mov, add), ist die für Menschen lesbare Form (Assemblersprache), und unser Programm definiert eine Prozedur für Datenpfade und Operationen.

Ich entschuldige mich, wenn dies eine Vereinfachung komplexerer Prozesse für diejenigen ist, die sich auf diesem Gebiet besser auskennen. Zu Ihrer Information, der Stack-Austausch für Elektrotechnik wäre ein großartiger Ort, um diese Frage zu stellen, da er sich mit Logik auf sehr niedriger Ebene befasst.

Jon
quelle
3

Wenn ich Ihre Frage verstehe, verstehe ich nicht, wie Bin / Hex oder Assembly zusammenhängen.

Ich gehe davon aus, dass Ihre Frage lautet, wie ich von den Basistoren UND ODER NICHT zu Anweisungen wie Bewegen, Laden, Speichern, Hinzufügen usw. komme.

Ich habe meinen eigenen kleinen Lehranweisungssatz, den ich von Grund auf erstellt habe und der einige Details enthält, wie ein Addieren und Subtrahieren von grundlegenden Toren und ähnlichen Dingen funktioniert . Http://github.com/dwelch67/lsasim .

Suchen Sie nach dem Code-Buch von Petzold. Der Weg zur Elementarstufe mag beginnen, aber er führt Sie langsam von nichts, was mit Computern und Elektronik zu tun hat, in die Binär-, Hexadezimal- und Grundtore usw.

Fragen Sie sich, wie Sie heute eine von Grund auf neu bauen würden oder wie sie es damals gemacht haben? Heute würden Sie mit einer Definition des Befehlssatzes beginnen. du setzt dich einfach hin und schreibst es auf, du denkst über die Arten von Anweisungen nach, die du haben musst, um die Ladungen und Speicher und Bewegungen und Alu-Zeug, und dann, wie viele Register, wie groß die Register sind, dies wirkt sich zum Teil auf die Anweisungsgröße aus, wie du denkst über die Anweisungsgröße ...

Lass mich innehalten und dich fragen, wie du ein Programm schreibst. Beginnen Sie mit einem leeren Bildschirm in einem Texteditor? Sie haben eine Vorstellung von der Aufgabe, die Sie zu lösen versuchen, die Variablen, die Sie möglicherweise benötigen, die Funktionen, die Programmiersprache usw. Und jede Person ist anders, aber bis zu einem gewissen Grad machen Sie ein wenig davon (sagen Sie, definieren und schreiben Sie Funktionen). ein bisschen davon (Header-Dateien mit wiederverwendbaren Definitionen und Aufzählungen und Strukturen und so) und ein bisschen davon (einfach Code, fülle die Funktionen mit Variablen und Code). Und Sie kreisen um die verschiedenen Aufgaben, und am Ende haben Sie das Gefühl, ein Gleichgewicht zwischen Codegröße, Geschwindigkeit, Lesbarkeit, Qualität, Funktionalität usw. zu haben. Nicht anders beim Hardware-Design. Hardware-Designer verwenden ebenfalls Programmiersprachen (vhdl, verilog) und durchlaufen denselben Prozess.

Genau wie bei der Entwicklung eines Softwareprogramms müssen Sie die Wünsche, die Leistung, die Größe, die Funktionen usw. in Einklang bringen. Möglicherweise sind Ihnen einige Designregeln auferlegt, die Sie oder Ihr Chef für Sie festgelegt haben Beim ersten Entwurf bis zur Implementierung stellen Sie möglicherweise fest, dass Sie einige große Fehler haben und zum ersten Entwurf zurückkehren und den Befehlssatz ändern müssen, große oder kleine Änderungen. Möglicherweise benötigen Sie einen Compiler und einen simulierten Prozessor, um festzustellen, dass Sie einige spezifische Anweisungen benötigen, die die Qualität des kompilierten Codes, die Leistung usw. erheblich verbessern.

Sie haben also einen Befehlssatz von Grund auf neu erfunden. Sie haben einige Erfahrungen mit dem Hardware-Design gesammelt, um ähnliche Befehle mit ähnlichen Bitmustern zu gruppieren, damit sie einfacher dekodiert werden können gutes Zeug. Heutzutage würde man eine Art Simulator bauen. Meines Wissens war ARM zuerst ein Software-Simulator, dann kamen die Hardware-Entwürfe später. Ich weiß nicht, ob das stimmt, aber ich halte an dieser Geschichte fest. Dies hängt vom Team ab. Einige Teams sind möglicherweise nur Hardware-Leute und möchten nur mit der Programmierung in der hdl beginnen. Einige wie ich möchten möglicherweise ein wenig von beidem tun. Heutzutage sind gute Hardware-Sprachsimulatoren verfügbar, sodass Sie keine Hardware mehr erstellen müssen, die Sie kompilieren und simulieren, und einen Großteil Ihres Debugs mit einem Hardware-Simulationsprogramm / -paket durchführen müssen. Das Software-Team kann Assembler und Compiler für den Befehlssatz entwickeln und simulierte RAM- und ROM-Feed-Programme für den simulierten Prozessor verwenden und diese auf Herz und Nieren prüfen. Wir haben einen vollständigen Linux-Boot auf einem Prozessor simuliert, an dem ich vor kurzem gearbeitet habe. Es hat viele Stunden gedauert, aber es hat funktioniert (auf diese Weise wurde ein Cache-Fehler in der Logik gefunden).

Also nun zu dem, was ich wirklich denke, dass Sie gefragt haben. Wie gelangt man mit einem Befehlssatz von den Basistoren zu einem Prozessor? Nun, grundlegende Gatter UND, ODER, NICHT sind wirklich analog, sie haben kein Zeitkonzept, Sie können die Spannung an den Eingängen nicht sofort ändern, und wenn Sie diese Spannung ändern, beginnen sich die Ausgänge zu ändern. Gates bestehen aus Transistoren und Transistoren sind Verstärker. Nehmen Sie den Eingang, multiplizieren Sie ihn mit einer bestimmten Zahl und lassen Sie so viel Strom auf der anderen Seite fließen. Wenn wir sie als logische Gatter verwenden, übersättigen wir sie tatsächlich. Die Eingangsspannung ist so hoch oder niedrig, dass der Transistor nur die maximale Spannung oder keine Spannung (Strom) ansteuern kann. Im Grunde ist der Transitor in einen Schalter verwandelt. Lange Rede kurzer Sinn, es gibt keinen Zeitbegriff. Um einen Befehlssatz zu haben, müssen Befehle ausgeführt werden, damit wir das Programm durchlaufen können. Wir müssen ein Konzept haben, in dem wir uns jetzt mit diesem Befehl befassen. Im nächsten Zeitfenster werden wir an diesem Befehl arbeiten. Genau wie beim Verwandeln eines Verstärkers in einen Schalter spielen Sie ähnliche Spiele, indem Sie grundlegende Logikgatter mit einer Uhr verwenden. Die Uhren kommen aus magischen Kristallen in einer Dose (die es nicht wert sind, hier darauf eingegangen zu werden), die Spannungen erzeugen, die mit einer festgelegten Rate ein- und ausgeschaltet werden. Verwenden Sie diese Spannung in logischen Gleichungen und Sie können beginnen, die Dinge zu sequenzieren. Die Uhren kommen aus magischen Kristallen in einer Dose (die es nicht wert sind, hier darauf eingegangen zu werden), die Spannungen erzeugen, die mit einer festgelegten Rate ein- und ausgeschaltet werden. Verwenden Sie diese Spannung in logischen Gleichungen und Sie können beginnen, die Dinge zu sequenzieren. Die Uhren kommen aus magischen Kristallen in einer Dose (die es nicht wert sind, hier darauf eingegangen zu werden), die Spannungen erzeugen, die mit einer festgelegten Rate ein- und ausgeschaltet werden. Verwenden Sie diese Spannung in logischen Gleichungen und Sie können beginnen, die Dinge zu sequenzieren.

sehr, sehr kurz an diese Wahrheitstabelle denken:

0 0 0
0 1 1
1 0 1
1 1 0

in binär:

0 + 0 = 1
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 (2 decimal)

Konzentriert man sich nur auf den lsbit, einen Ein-Bit-Addierer, so beschreibt die obige Wahrheitstabelle einen Ein-Bit-Addierer. Es beschreibt auch ein XOR-Gatter. Eine Eingabe ist wahr oder die andere, aber nicht beide.

Um mehr als ein Bit zu erhalten, müssen Sie sich die Übertragsbits Übertragsin und Übertragsin ansehen, und Sie benötigen einen Drei-Bit-Addierer, zwei Operanden und einen Übertragsin mit zwei Ausgängen, Übertragsin und das Ergebnisbit. Sobald Sie diesen Addierer mit drei Eingängen und zwei Ausgängen haben, können Sie ihn so weit kaskadieren, wie Sie möchten. Aber das ist immer noch analog, die Tore ändern sich sofort.

Wenn Sie diesen analogen Addierer in einen ADD-Befehl umwandeln, haben Sie eine Logik, die den Befehl betrachtet, der als Eingang für diese von Ihnen arrangierten Gatter fungiert. Einige der Bits in der Anweisung besagen, dass dies eine Additionsanweisung ist. Einige der Bits besagen, dass ein Operand ein solches und ein solches Register ist. Vielleicht das Register 7. Andere Bits besagen, dass der andere Operand das Register 4 ist. Abhängig von Ihrer Architektur Möglicherweise ist in der Anweisung ein anderes Register definiert, das besagt, dass das Ergebnis in Register 2 abgelegt werden soll. Dies wird nun von mehr Logik erkannt, da der Inhalt von Register 7 an einen Eingang des Alu-Addierers und die Eingänge von Register 4 an den Addierer weitergeleitet werden müssen und Sie weiterleiten müssen der Ausgang des Addierers zum Register 2. Da der Takt Teil dieser Logik ist, gibt es eine Zeitspanne vom Beginn der Taktperiode bis zum Beginn der nächsten Taktperiode, in der sich alle analogen Signale beruhigen und die Logikgleichung auflösen, zu der sie verdrahtet sind. Ähnlich wie beim Umlegen eines Lichtschalters ändert sich der Lichtstatus von "Aus" in "Ein". Es dauert eine Weile, bis sich das Licht erwärmt und im Grunde genommen in einen stabilen Zustand übergeht. Nicht viel anders hier.

Es gibt eine Logik, die besagt, dass, wenn diese Taktperiode die Ausführungsphase eines AND-Befehls ist, die nächste Taktperiode das Ergebnis im Ausgangsregister speichern wird. Gleichzeitig hole ich den nächsten Befehl usw. Für moderne Prozessoren, bei denen die Alu-Ausführung oft nur eine Taktperiode beträgt, weil die analoge Logik die logischen Gleichungen so schnell auflösen kann. Ältere Prozessoren, die Sie bis zu einer bestimmten Anzahl zählen mussten, lassen den Addierer verdrahtet, warten auf x Taktzyklen, bis die Addiererlogik aufgelöst ist, und tasten dann das Ergebnis vom Ausgang ab, speisen die verschiedenen Alu-Eingänge ein und warten auf x Taktzyklen Wiederholen Sie diesen Vorgang für immer oder bis das Gerät ausgeschaltet ist.

Was meine ich mit logischen Gleichungen? Wenn Sie möchten, können Sie sich das mit AND, OR, NOT Gates vorstellen. Für jedes Eingangsbit der Alu-Addierschaltung gibt es eine Gleichung, wahrscheinlich eine sehr lange Gleichung, die den Takt enthält, der die Flip-Flops (einzelne / einzelne Speicherbits) enthält, die den aktuellen Befehl enthalten (plus die Gleichungen, die jeden von diesen speisen) Speicherbits) und weiter und weiter. Nehmen Sie eine einzelne von Ihnen geschriebene Softwarefunktion in der Sprache, in der Sie sie geschrieben haben, vorausgesetzt, dies ist eine Funktion, die die Eingaben entgegennimmt, eine Aufgabe ausführt und dann ein Ergebnis beendet und zurückgibt. Denken Sie an alle möglichen Kombinationen von Eingaben und an die verschiedenen Ausführungspfade, die diese Funktion durchläuft. Sie haben es vielleicht in einer höheren Sprache geschrieben, aber Sie könnten es wahrscheinlich sogar in dieser Sprache umschreiben, um primitiver und primitiver zu sein, indem Sie viele verschachtelte If-Then-else-Strukturen verwenden. und vielleicht tiefer in die Assemblersprache gehen. Nicht anders als die Gleichungen, über die ich spreche, programmiert der Hardware-Programmierer diese langwierigen Gleichungen nicht mehr, als Sie wahrscheinlich in langwierigen Wenn-Dann-Sonst-Bäumen in Assemblersprache programmieren, wenn die Programmiersprache Ihrer Wahl so viel davon spart. Genau wie der Compiler, den Sie verwenden, Ihren kleinen Quellcode in eine langwierige Baugruppe mit vielen Wenn-Dann-Elementen umwandelt, gibt es einen Compiler, der den Code der Hardware-Programmiersprache in logische Gleichungen umwandelt.

Zurück zur ersten CPU (die wir heute als Mikrocontroller bezeichnen würden, aber dann als CPU). Sie haben alle oben genannten Aufgaben auf Papier erledigt und keine Hardware-Programmiersprachen verwendet. Sie haben die logischen Gleichungen tatsächlich geschrieben, aber Sie haben die Bitmuster für die Anweisungen noch sorgfältiger ausgewählt, um die Anzahl der Gates und die Drähte zum Verbinden dieser Gates so einfach wie möglich zu gestalten wie praktisch. Auf dem Papier mussten Sie beide von Hand die lange Liste der verkabelten Logikgatter erstellen und dann die tatsächlichen Komponenten auf eine vergrößerte Version der Siliziummaske zeichnen. Selbst heute werden Chips mit einem Verfahren hergestellt, das einem fotografischen oder siebdruckähnlichen Verfahren ähnelt. Sie würden also diese Blaupausen nehmen und schrumpfen, um sie dann auf die Siliziumschichten aufzutragen.

Auch hier hatten früher alle ein besseres Verständnis für Assembler, und vielleicht haben Sie am Ende keine Assembler-Programmierung durchgeführt. Vielleicht hatten Sie keinen Texteditor und keinen Assembler, mit dem Sie Ihre ersten Programme von Hand auf Papier schreiben mussten unter Verwendung eines Referenzhandbuchs, das von Hand in Maschinencode, Einsen und Nullen umgewandelt wurde. Auf einigen dieser Computer mussten Sie den RAM möglicherweise laden, indem Sie die Schalter umlegten, die Adressbits umlegten, die Datenbits umlegten, bis sie mit den Zahlen auf Ihrem Papier übereinstimmten, das Uhrbit nach oben und unten umlegten und einen Speicherplatz mit geladen haben Wiederholen Sie ein Byte einer Anweisung Ihres Programms einige hundert Mal und hoffen Sie, dass Sie keine Fehler machen.

Genauso wie der erste C-Compiler wahrscheinlich in einer anderen Sprache geschrieben wurde, wurde er zum Selbst-Hosting, indem er in C neu geschrieben und vom ersten C-Compiler kompiliert und dann wieder von selbst kompiliert wurde. Dann wurden die C-Compiler verwendet, um andere Programmiersprachen zu erfinden, die sich dann selbst hosten. Wir haben Betriebssysteme und Texteditoren erfunden, die auf sich selbst aufbauen, und es ist alles schwarze Magie, die ein paar Leute hinter dem Vorhang in der Ecke tun müssen ...

Ja, sehr langatmig, es ist eine große Frage, die jahrelanges Studium und Erfahrung erfordert, um wirklich zu verstehen. schau dir mein lsasim an, ich behaupte nicht, ein Experte in irgendetwas zu sein, aber es ist ein Befehlssatz, es gibt sowohl einen Simulator, der den in C geschriebenen Befehl ausführt, als auch eine andere Implementierung des Prozessors, die in einer Hardware-Programmiersprache implementiert ist, die sein kann simuliert mit verschiedenen Werkzeugen. Plus ein grober Assembler und einige andere Werkzeuge und so. Wenn Sie einiges davon untersuchen, insbesondere den Code der Hardware-Programmiersprache, könnte dies möglicherweise die Lücke schließen, von der ich annehme, dass Sie gefragt haben. Wenn ich diese Lücke nicht geschlossen habe oder eine langatmige Tangente gebildet habe, lassen Sie mich bitte wissen, dass ich diese Antwort glücklich entfernen werde (vorausgesetzt, dass ich nicht in der Lage bin, mich mit Programmierern auszutauschen).

Oldtimer
quelle
Dies beantwortet wirklich nicht die Frage des Autors, es fügt zumindest nichts zur Diskussion hinzu, was die akzeptierte Antwort nicht abdeckte. Ihre binäre Mathematik ist nicht 100% korrekt. 1 + 1 ist 0 mit einem Überlauf von 1. Abhängig von der Größe der Registrierung wäre es entweder 2 oder 0.
Ramhound
@dwelch VERDAMMT! Ich bin dein Herzensfan, wenn nicht weniger. +1
AceofSpades
2

CPUs arbeiten mit Nullen und Einsen. Alle Befehle hatten eine Bitfolge, die sie definierte. Das war Maschinencode. So schwer für Menschen zu lesen und zu schreiben. Als ersten Schritt gruppierten wir die Nullen und Einsen in 4-Bit-Sequenzen und verwendeten 0 bis F, um sie darzustellen. Dies reduzierte die Zahlen, die wir uns merken mussten, aber es war immer noch nicht einfach, sich den Hex-Code für Anweisungen zu merken.

Also haben wir angefangen, Assembler zu verwenden, die "Wörter" wie MOV und ADD hatten. Der Assembler würde die Anweisungen durch den richtigen Satz von 0 'und 1' ersetzen, um die "Auflistung" der Assembly in Maschinencode umzuwandeln.

Schließlich entwickelten wir "höhere" Sprachen, in denen "Anweisungen" ganze Sequenzen von Maschinencode darstellen könnten.

Jim C
quelle
Zu Ihrer Information, octal wurde als binäre Kurzform vor hexadezimal verwendet.
Ocodo
Slomojo hat Recht, Octal, Basis 8 verwendet 3 Bits, wurde zusammen mit Hex verwendet, Basis 16 verwendet 4 Bits. Octal hatte den Vorteil, dass jeder wusste, welche Zahlen 0 bis 7 repräsentierten. Leute, die Hex nicht benutzten, wurden oft durch die "Ziffern" A bis F
Jim C
0

Ich bin vor kurzem auf dieses Q / A gestoßen und vor ungefähr einem Jahr, als ich angefangen habe, diesen Weg zu gehen. Ich hätte festgestellt, dass dies eine sehr gute Ressource und Referenzseite in Bezug auf meine eigenen verwandten Fragen ist.


Teil 1: -Vorbereitung-

Ein bisschen über mich:

Mitte bis Ende der 80er Jahre, als ich noch in der Grundschule war, zerlegte ich Schrott-Stereoanlagen, Videorecorder und andere Elektronengeräte, die in den 50er bis 80er Jahren hergestellt wurden, und schaute auf die Leiterplatten und wollte immer wissen, wie sie waren Arbeit ... Wie haben sie eigentlich das Sendesignal aufgenommen, Audio, Video produziert, dies und das getan usw. ... Ich konnte die einzelnen Teile hier und da erkennen, wie z. B. einen Widerstand, einen Kondensator, eine Diode und einen Transistor, aber nicht wissen, was sie getan haben oder wie sie in einem so jungen Alter funktionierten.

Im Laufe der Jahre war ich immer außergewöhnlich in Mathematik, Physik und Chemie. Ich verstand Mathe zu einem hohen Grad und konnte sogar einige einfache oder grundlegende Schaltkreise aus meiner Mittel- und Oberschulzeit lesen, die später kamen, aber ich habe es nie geschafft, etwas über die Logikgatter und ihren Aufbau zu lernen ... das tat ich jedoch lerne Boolesche Algebra in der High School aus meiner Klasse Logic, Probability and Statistics Honors. Alle meine mathematischen und naturwissenschaftlichen Klassen waren Ehrenklassen. Ich habe Calculus erst in meinem zweiten Semester an einem Community College absolviert. Ich habe die College-Algebra abgeschlossen und Trigonometrie als Auffrischungskurs belegt. Meine höchste Mathematikstufe im Klassenzimmer ist Kalkül II einer einzelnen Variablen.

Ich spiele seit meinem dritten oder vierten Lebensjahr Videospiele. Als Kind hatte ich den Atari, den NES, Sega Genesis und die PS1. Als ich älter wurde und in meine späten Teenager und frühen 20er Jahre kam, hatte ich die PS2 und die SNES mit bevorzugten ausgewählten Titeln erworben. Dies gilt auch nicht für PC-Spiele, die bis zu Doom!

Ich war schon immer ein begeisterter Konsolen- und PC-Spieler und dies schließt keine Flipper- und Arcade-Spiele ein.

Ich bekam meinen ersten PC, als ich zu Weihnachten in den frühen 90ern ungefähr 12 Jahre alt war. Die Tage von DOS 6.0 und entweder Win 3.11 oder OS / 2. Seitdem war ich immer mit der "Windows" -Betriebssystemfamilie vertraut, und alle Systeme, die ich hatte, waren Intel Architecture. Ich hatte von der Schule oder vom College an nur begrenzte Erfahrung mit Apple oder Mac, aber ich hatte nie das Privileg, auf Linux-Systemen zu arbeiten. Ich habe Cygwin und ich habe versucht, Bash zu lernen, aber ich bin so an Dos oder die Eingabeaufforderungssyntax gewöhnt.

In den frühen 90ern bekam ich ein oder zwei Exemplare von PC-World und tippte die Code-Schnipsel in QBasic ein, die ich nicht sehr gut kannte und versuchte, diese Programme zum Laufen zu bringen. Das einzige Programm, das erfolgreich war, war ein Programm, das das Drücken von Schlüsseln in der Haupttastenreihe in verschiedene Klingeltöne umwandelte. Ich meine nicht die Klingeltöne auf einem Handy. Ich meine eine kontinuierliche Frequenz, solange Sie die Taste gedrückt halten.

Es war schon immer meine Leidenschaft, nicht nur wissen zu wollen, wie elektronische Geräte auf digitaler und logischer Ebene funktionieren, sondern auch zu lernen, wie man einen Computer programmiert, sondern ich hatte immer den Wunsch, mein eigenes Video zu machen Spiele. Schon in den frühen 90ern wollte ich die Spiele Frogger und Tetris machen ...


Dies wurde meine Hauptmotivation und mein Wunsch, mich mit einer der härtesten Arten der Programmierung oder Softwareentwicklung auf dem Gebiet der Informatik zu befassen, und das ist 3D Game Engine Design. Es gibt andere Bereiche in der Informatik, die genauso schwierig sind, aber jede hochentwickelte Spiel-Engine wird in der Regel fast alle umfassen, da die einzelnen Komponenten oder Sub-Engines ihre Techniken und / oder Eigenschaften erfordern.

Ich hatte einige Programmierkenntnisse aus meiner High School-Zeit, aber diese beschränkten sich auf das schreckliche Visual Basic. Ich fing an, C / C ++ zwischen 2002 und 2003 zu lernen, und zwar erst ein paar Jahre nachdem ich 1999 mein Abitur gemacht hatte. Bis heute habe ich keine College-Erfahrung in Informatik oder Computertechnik, sondern durch Hingabe und Entschlossenheit, ich habe so gut wie jedes Konzept gelernt, das es gibt, wenn es um Computer, Hardware, Programmierung, Algorithmen usw. geht, und ich lerne immer noch so viel ich kann ...

In den frühen Tagen des Lernens von C / C ++ hatte ich Zugang zum Internet, aber das Internet befand sich noch in den Anfängen, Websites wie Amazon, Youtube, Facebook usw. existierten noch nicht einmal, es waren noch 56.000 Tage Wählmodems, die Ihre Telefonleitung aufrüsten, wenn Sie keine zweite Standleitung haben. Es würde Minuten dauern, bis ein Bild auf dem Bildschirm angezeigt wird, unabhängig von der kontinuierlichen Videowiedergabe.

Wenn es darum ging, in C ++ zu recherchieren und zu lernen, wie man programmiert, waren die Ressourcen begrenzt und die meisten im Textformat. Bei dem Versuch, die Projekte aus den Anfängen des Internet-Tutorials in Angriff zu nehmen, waren viele dieser Projekte nicht vollständig abgeschlossen, die Autoren waren entweder Fachleute oder Studenten und sie gingen in vielerlei Hinsicht davon aus, dass der Leser bereits mit vielen der erforderlichen Konzepte wie der Kompilierung vertraut war , Verlinken und Debuggen und Bibliotheksintegration.

Für jemanden, der nichts über diese Themen weiß, ist er ratlos, weil er nicht weiß, was schief gelaufen ist, wie man es repariert und wie man es richtig zum Laufen bringt. Ich habe in jenen Tagen mit sehr begrenzten Ressourcen viele Stunden des Versuchs und Irrtums gebraucht. Um Hilfe zu bitten, wie wir es jetzt mit dieser Website können, oder nach detaillierten Erklärungen zu suchen, die Sie auf cppreference finden können, war nicht verfügbar! Wenn Sie persönlich niemanden kannten, gab es nicht so viele, an die Sie sich wenden konnten, um Hilfe zu erhalten!

Mit der Zeit verbesserte ich hier und da mein Wissen und schließlich wurde das Internet zu DSL. Jetzt wurde das Hochgeschwindigkeitsinternet interaktiver, Videos wurden angezeigt, die Qualität der Videos wurde mit der Zeit besser, Websites wie z als Youtube auftauchte und die Recherche etwas einfacher wurde. Es wurden immer mehr Tutorials verfügbar, einige waren gut und nützlich, andere lehrten schlechte Praktiken ...

Ich hatte auch viel Zeit damit verbracht, die notwendigen Werkzeuge für die Entwicklung zu finden und zu erwerben. Ich musste die Sprachsyntax, den Compiler und den Kompilierungsprozess, das Verknüpfen, Erstellen und Debuggen lernen. Dann musste ich lernen, welche verschiedenen Bibliotheken und APIs zur Verfügung stehen und wie ich meine Projekte oder Lösungen so konfiguriere, dass all diese Abhängigkeiten verknüpft werden.

Im Laufe der Jahre habe ich beobachtet, wie die C ++ - Sprache im Laufe der Zeit gewachsen ist, sich weiterentwickelt und angepasst hat. Am Anfang blieb es viele Jahre lang fast gleich, aber in den letzten 10 Jahren hat es sich innerhalb dieser kurzen Zeitspanne seit seiner Gründung dramatisch verändert.

Ich erwähne dies alles, weil C ++ eine der schwierigsten Sprachen ist, die es zu beherrschen gilt, da es vielseitig, leistungsstark, mit zahlreichen Funktionen ausgestattet und in der Lage ist, sich selbst in den Fuß zu schießen! Und trotz aller Einschränkungen ist es eine der leistungsstärksten und beliebtesten Sprachen, die in der führenden Industrie als Standard für diese Art der Entwicklung verwendet wird, da es bei korrekter Ausführung schnell, präzise, ​​zuverlässig und unter Verwendung der folgenden Sprachen funktioniert kleinster Fußabdruck.

Seitdem bin ich seit vielen Jahren Autodidakt in C / C ++ mit der Absicht und dem Schwerpunkt, 3D-Grafikprogrammierung und Game-Engine-Design zu erlernen. Ich habe 100 bis 1000 Stunden lang gesucht, recherchiert und vieles mehr in das Lesen, Lernen und Anwenden dieses Wissens für die Gestaltung nützlicher Arbeitsprodukte und -anwendungen gesteckt. Ich hatte immer den Willen und den Wunsch, mehr zu lernen, um meine Fähigkeiten und mein Handwerk zu verbessern.


Dies war die erste Phase, dann begann ich mit DirectX 9.c zu lesen und zu arbeiten, was ich in C / C ++ und sogar in C # getan habe. Dann bin ich auf DirectX 10 und Legacy OpenGL 1.0 umgestiegen. Von ihnen kamen DirectX 11 und OpenGL 3.x - 4.x und jetzt habe ich mich sogar an Vulkan versucht.

Ich habe erfolgreiche Spiele-Engines entwickelt, die in verschiedenen Online-Tutorials sowohl in Text- als auch in Videoformaten arbeiten. Ich habe bereits festgestellt, dass ich einen starken Hintergrund in Mathematik habe, dieser war jedoch auf Kalkül I und II beschränkt. Ich musste mir selbst Vektorrechnung beibringen, die ich aus meiner Physikklasse in Analysis kannte, aber für lineare Algebra mit affinen Transformationen und analytischer Geometrie musste ich sie selbst lernen, wenn bestimmte Gleichungen, Funktionen, Methoden, Algorithmen und Konzepte waren gefragt. Dann musste ich lernen, wie man diese in effizienten, lesbaren, zuverlässigen und wiederverwendbaren Code umsetzt, der generisch und fehlerfrei ist und Hunderte bis Tausende von Stunden Debugging erfordert.

Es war eine wunderbare Reise, die Themen und Algorithmen wie Speicherverwaltung, Referenzzählung, Instanziierung, Rekursion und vieles mehr zu lernen, die in vielen, wenn nicht allen Komponenten einer Spiel-Engine verwendet werden, in denen sie sehr umfangreich sind. Ich könnte alle hier auflisten, aber das wäre genug Information, um 3 oder 4 Antwortfelder zu füllen, die es wert sind, geschrieben zu werden. Ich werde jedoch die Liste der allgemeinen Themen nur nicht ihre Unterthemen enthalten.

Hier finden Sie die Themen oder Themenlisten in einer voll funktionsfähigen Game-Engine, die alle verschiedenen Rendertechniken, das Einrichten der Rendering- und Shader-Pipelines, Shading- und Beleuchtungstechniken über Shader, Pre- und Post-Processing, Frame-Buffer und Back-Buffer umfasst , Laden und Parsen von Bildern, Laden von Audio- und Modelldateien, Erstellen primitiver Formen mit Farbmaterialeigenschaften, Textur- und Normalkoordinaten mit manueller Texturzuordnung, Objekttransformationen, Kameratypen, Szenendiagrammhierarchien, Manager-Klassen für Texturen, Audio, Schriftarten und Shader sowie Speicherverwaltung, Protokollierungssystem mit Ausnahmebehandlung, Multithread- und Parallelprogrammiertechniken, Vernetzung, Physik-Engine, Kollisionserkennung, Partikelgenerator, Animation, Spiel-KI, Geländegenerierung, Sky Boxes und Sky Domes, Wasser-Rendering,Laub und mehr ..., GUIs mit strukturierter Schriftart für Textwiedergabe, HUD-Überlagerungen, Inventare, Karten- und Makrogenerierung, Statussystem und Zustandsautomaten und schließlich Schreiben eines Parsers zum Erstellen Ihrer eigenen Skriptsprache, um einen Großteil dieser Objekte zu automatisieren Die Möglichkeit, Datenwerte innerhalb der Engine zu ändern, ohne dass eine Neukompilierung erforderlich ist, indem die Datendateien geladen werden, um die Datenobjekte und -strukturen in ihren jeweiligen Containern beim Start der Anwendung aufzufüllen.und schließlich schreiben Sie einen Parser, um Ihre eigene Skriptsprache zu erstellen, mit der viele dieser Objekte automatisiert werden können, damit Datenwerte innerhalb der Engine geändert werden können, ohne dass eine Neukompilierung erforderlich ist, indem nur die Datendateien geladen werden, um die Datenobjekte und Strukturen in den jeweiligen Containern aufzufüllen beim Start der Anwendung.und schließlich schreiben Sie einen Parser, um Ihre eigene Skriptsprache zu erstellen, mit der viele dieser Objekte automatisiert werden können, damit Datenwerte innerhalb der Engine geändert werden können, ohne dass eine Neukompilierung erforderlich ist, indem nur die Datendateien geladen werden, um die Datenobjekte und Strukturen in den jeweiligen Containern aufzufüllen beim Start der Anwendung.


Über die Jahre hinweg war ich fasziniert, Assemblersprache lernen zu wollen. Ich wollte etwas über Compiler, Assembler und einfache Betriebssysteme lernen, meine ihre internen Abläufe, wie sie gebaut und entworfen wurden.

Die Zeit verging und dann trat ich ein Stückchen vor und fing an, die Hardware-Emulation zu erlernen. Ich habe mich speziell auf das NES konzentriert, wollte aber die Hardware-Emulation von CPUs im Allgemeinen erlernen. Dies führte mich dazu, etwas über den Befehlssatz zu lernen, in dem ich das Konzept bereits kannte, und über das, was es war, da ich mit der x86-Familie von Intel bereits einigermaßen vertraut war, aber jetzt musste ich den Befehlssatz 6502 lernen.

Indem ich mich damit befasste, machte ich am Ende mehr Nachforschungen und lernte die Befehlssatzarchitektur aus technischer Sicht. Dies brachte mich dazu zu lernen, wie die CPU aus den Logikgattern aufgebaut ist und wie die Logikgatter zusammen mit anderen verschiedenen elektrischen Komponenten aus Transistoren aufgebaut sind. So lernte ich dies aus zwei Perspektiven: von oben nach unten und von unten nach oben. Beide Methoden waren sehr effektiv und ich denke, dass das Lernen von beiden dazu beiträgt, die Brücke oder Lücke zu bauen, in der die Software die Hardware bearbeitet.

Aus diesem Grund musste ich meine Boolesche Algebra auffrischen und lernte schließlich K-Maps, Implikationstabellen, Zustandsmaschinen, sowohl Mealy als auch Moore und verschiedene andere Dinge, die Binärlogik und Arithmetik mit den physikalischen logischen Gattern und integrierten Schaltkreisen in Beziehung setzen. Und das bringt mich in die Vergangenheit zurück, in der ich angefangen habe, mit Logisim zu arbeiten und angefangen habe, HDL, VHDL, Verilog usw. zu lernen.

All das habe ich in meiner Freizeit gelernt, wann immer ich konnte. In den letzten 15 - 18 Jahren.


Hier sind einige der Websites und Links, die mich im Laufe der Jahre geführt haben. Viele davon sind neu, da viele der Websites, von denen ich ursprünglich erfahren habe, nicht mehr existieren, ich ihre Links verloren habe und mich nicht erinnere, oder Suchmaschinen sie ganz hinten in ihre Suchlisten verschoben haben ...

  • Sprachen - C ++

  • 3D-Grafik-Tutorials und Ressourcen-Websites

  • Youtube-Serien und Kanäle behandeln die oben genannten Themen sowie Hardware, Computer und Elektrotechnik. Es gibt zu viele, um sie aufzulisten, deshalb werde ich hier einige auflisten, die ich am nützlichsten und einfallsreichsten finde. Ich werde die Links nicht bereitstellen, aber Sie können YouTube nach diesen Kanälen durchsuchen.

    • 3Blue1Brown - Fortgeschrittene Mathematik
    • Bisqwit - Erweiterte C / C ++ - Programmierung (Anwendungsprojekte) - NES Hardware Emulator
    • Jason Turner - Fortgeschrittene moderne C ++ - Programmiertechniken
    • javidx9 - Fortgeschrittene C / C ++ Programmierung (Anwendungsprojekte) - NES Hardware Emulator / Some Assembly
    • MIT OpenCourse - Hochschulkurse in Mathematik und Informatik
    • Bilkent Online Courses - Hochschulkurse in Informatik und Computertechnik (CPU Design MIPS)
    • The Cherno - Advanced C / C ++ - Programmierthemen und -anwendungen - Game Engine-Entwicklung
    • Ben Eater - Hardware Engineering - Praktische Anwendung über Steckbretter
    • Neso Academy - Hardware Engineering - Theorie und Konzepte
    • Socratica - Python-Programmierung
    • Einfach ausgedrückt - Hardware Engineering - Theorie und Konzepte
    • Bitweise - Fortgeschrittenes C / C ++ Entwerfen eines Assemblers über Hardware-Emulation
    • Bo Qian - C ++ Themen in Datenstrukturen und Algorithmen.
    • LineByLine - Vulkan Programmierung
    • Joshua Shucker - Vulkan Programmierung
    • www.MarekKnows.com - C ++, 3D Math und Game Engine Entwicklung

Und diese berücksichtigen nicht einige der verschiedenen Bücher, die ich zu diesen Themen habe.

-Hinweis- Bitte stimmen Sie nicht darüber ab, da dies nur eine Nachricht an den Leser meiner persönlichen Erfahrung ist und keine Versuche unternommen werden, die ursprüngliche Frage zu beantworten oder auf sie Bezug zu nehmen. In den nächsten Tagen, wenn ich Zeit habe; Ich werde eine Antwort hinzufügen, um meine Gedanken über die Frage des OP zu äußern und nützliche Links als Referenz und Ressourcen bereitzustellen. Außerdem werde ich diese Antwort aktualisieren, um einige Links hier aufzunehmen und diesen Hinweis zu ändern. Es ist spät und ich habe derzeit keine Zeit, das, was ich bereits geschrieben habe, zu korrigieren und zu bearbeiten. Ich mache das, wenn ich kann ".

Francis Cugler
quelle
Ich habe gerade diese Antwort oder diesen Beitrag aktualisiert. Ich wollte den 2. Teil hinzufügen, der die Frage tatsächlich beantwortet, aber ich habe nicht genug Reputationspunkte, um dies zu tun. Es wird einige Zeit dauern, bis ich die erforderlichen Reputationspunkte aufgebaut habe, bevor ich meine zweite Antwort hinzufügen kann. Dieser Beitrag ist nicht die eigentliche Antwort, aber ich werde ihn als Referenz verwenden und in der Begründung meiner wahren Antwort nachschlagen. Einige der oben aufgeführten Ressourcen sind erforderlich, um die Lücke zwischen Software und Hardware zu schließen.
Francis Cugler
-2

Im Kern ist eine CPU normalerweise nur eine Zustandsmaschine. Sie müssen also verstehen, wie sich logische Gatter und Flip-Flops oder Register zu Zustandsautomaten verbinden.

Eine Zustandsmaschine nimmt Eingaben und den aktuellen Zustand entgegen, führt sie durch eine boolesche (und möglicherweise arithmetische) Logik und stellt dann Ausgaben und einen nächsten Zustand bereit. Einer der Eingänge kann das Befehlsregister sein. Einer der Ausgänge kann eine Freigabe und eine Auswahl für die Quelle sein, um das Befehlsregister neu zu laden, oder kann auch ein anderes Register, das als Programmzähler fungiert, inkrementieren oder laden. Damit und mit etwas adressierbarem Speicher können Sie Anweisungen durchgehen.

Sobald Sie die Möglichkeit haben, Befehle zu sequenzieren, können Sie diese Befehlsbits sowie den aktuellen Status mithilfe der Logik in eine andere Gruppe von Steuerbits dekodieren. Einige dieser Steuerbits können als Eingaben dienen, um eine Reihe von Logikfunktionen zu steuern, die arithmetische und wortweite Logik ausführen können. Dies wird als ALU bezeichnet. Andere Bits können Daten laden oder Eingänge für die ALU auswählen. Andere Bits können angeben, wo die Ergebnisse der ALU gespeichert werden sollen. Oder Adressregister laden. Oder schreiben Sie in den Speicher oder andere Ausgänge. Etc.

Ein Teil des Entwurfs eines Befehlssatzes besteht darin, herauszufinden, welche Kombinationen von Bits beim Dekodieren alle Register und die Reihenfolge der Zustandsmaschinen steuern. Dies wurde getan und auf tausende verschiedene Arten (neu) optimiert.

Es gibt mindestens 3 Niveaus der Hochschullehrbücher auf diesem nicht-trivialen Thema.

hotpaw2
quelle
2
Dies erklärt nicht, wie die MOV-Operation in einen Binärwert umgewandelt wird. Hier wird nicht erwähnt, dass die Anweisung MOV ein Wert ist, sondern ein Schlüsselwort, das wir verwenden, sodass wir uns keinen 16- bis 32-Bit-Binärwert merken müssen.
Ramhound