Quasi alles gespeicherte ist in Register unterteilt. Jedes Register hat eine Adresse und einen Wert sowie üblicherweise die gleiche Bitzahl (8-Bit-Prozessor = 8-Bit). Es gibt den Arbeitsspeicher und Festspeicher aber auch Ein- und Ausgänge.
Das
Steuerwerk holt sich der Reihe nach Befehle. Früher wurde einfach der Lochstreifen eins weiter geschoben, heutzutage zählt ein Register bei jedem Befehl hoch und liest den Befehl von der entsprechenden Adresse des Speichers. Bei Sprungbefehlen wird dieses Register entsprechend geändert. Der Befehlsdecoder ist auch Teil des Steuerwerkes und übersetzt die Befehle, sodass sie ausgeführt werden können.
Beispielsweise für eine Addition wird erst Eingang 1 in RAM-Register 1 geladen, Eingang 2 in RAM-Register 2.
Nun werden diese RAM-Registerinhalte in die Eingangsregister der
Arithmetisch-logischen Einheit (ALU) geladen und diese bekommt an den Steuereingängen den Wert für "Addition" mitgeteilt. Nachdem die Berechnung durchgeführt wurde, wird deren Ausgangsregister auf RAM-Register 1 übernommen und RAM-Register 1 auf das Ausgangs-Register 1 übernommen.
Je nach Controller gibt es unterschiedliche Befehle, wodurch die Controller unterschiedliche Dinge können. Für diese Aufgaben wäre es z.B. praktisch, der Controller könnte direkt den Eingangswert an die ALU weitergeben, ohne ihn im RAM zwischenspeichern zu müssen.
Ebenso ist es auch unterschiedlich, was die ALU kann. Z.B. ob man für das 8-fache von 5 das Register einfach um 3 verschieben kann, ein Multiplizierer vorhanden ist oder 5+5+5+5+5+5+5+5 gerechnet werden muss.
Die ersten Computer kamen mit wenigen Befehlen aus, da jeder Befehl vom Programmierer herausgesucht werden musste und das Programm letztendlich auch mit 5+5+5+5+5+5+5+5 noch schneller war als ein Mensch. Heutzutage wird üblicherweise mit einer höheren Sprache programmiert, der Compiler übersetzt das geschriebene in Maschinencode und sucht idealerweise auch die richtigen Funktionen heraus, die der Controller besitzt. Geht es aber wirklich um Performance (Live-Bildverarbeitung, Crypto-Mining, ...) wird weiterhin mit Assembler (sehr nach an Maschinencode) programmiert oder programmierbare Logik verwendet.
Programmierbare Logik sind im Prinzip nur verbundene Speicher deren Adressleitungen angesprochen werden. Für ein AND wird einfach ["0","0","0","1"] eingetragen.
00 (=0) => 0
01 (=1) => 0
10 (=2) => 0
11 (=3) => 1
Meist arbeitet man mit 4 Eingängen und Dinge wie "((A UND (NICHT B)) ODER (B UND D) ODER ((NICHT A) UND C) UND (NICHT (A UND B UND C UND D))" lassen sich so in einem "Gatter" erledigen: Wertetabelle ausrechnen und eintragen: ["0","1","0","0","0","1","0","0","0","1","1","0","1","1","1","0"]
Für z.B. einen Addierer nimmt man eben mehrere "Gatter", gibt ihnen die selben Eingänge und legt die Werte für die Ausgänge bei den verschiedenen Eingangskombinationen an.
Da nicht alle Berechnungen von einer einzelnen ALU durchgeführt werden müssen, kann dies durch die Parallelisierung für spezielle Anwendungen durchaus schneller sein.
Und natürlich lassen sich auch noch Controller und programmierbare Logik kombinieren.