Computermodell

Ein stark vereinfachtes vonNeumann-Computermodell (Version: 16. Juli 2021)

Dieser Text soll aufzeigen, was «Nativer Code» bedeutet und warum ein für ARM-Prozessoren kompilierter Programmcode nicht auf INTEL-Prozessoren laufen kann.
Definition von «Nativer Code»: Mit «Nativer Code» ist ein kompilierter Programmcode (Maschinensprache oder Maschinencode) gemeint, der mit dem Befehlssatz eines bestimmten Prozessors (z.B. Intel x64-Prozessor) ausgeführt wird. Bei Intel-Architektur wird kompilierter Programmcode mit der Dateiendung .EXE versehen.
(Dies gilt nicht für Skriptsprachen wie z.B. Javascript, php etc. Diese müssen von einer speziellen Software (z.B. Javascript → Webbrowser) interpretiert, d.h. in die für den jeweiligen Prozessor gültigen Maschinenbefehle übersetzt/kompiliert werden.)

Einführung:

Mikroprozessoren sind aus den komplexen Anforderungen an elektronische Schaltkreise entstanden. Durch immer höhere Integrationsdichten wurde es möglich ein komplettes Steuer- und Rechenwerk auf einem Chip zusammenzufassen – dem Mikroprozessor. Kern des Mikroprozessors, die eigentliche Recheneinheit ist der zentrale Prozessor, die CPU (Central Processing Unit). Um Aufgaben auszuführen, benötigt die CPU den Steuerbus oder Control Bus. Das Rechenwerk ist unter den Bezeichnungen arithmetisch-logische Einheit oder ALU  (engl. Arithmetic Logical Unit) bekannt. Es ist der Teil eines Computers, der arithmetische (Addition, Subtraktion, Multiplikation, Division) und logische (UND-, ODER-, NICHT-Verknüpfung) Operationen ausführt. Damit daraus ein funktionsfähiger Rechner entsteht, werden zusätzliche Komponenten benötigt:

  • Um Daten und Programme zu speichern werden Speicherbausteine eingesetzt. Diese sind als überschreibbare Speicher (RAM) oder als Festwertspeicher (ROM, PROM, EPROM, EEPROM, Flash-PROM) realisierbar. Wenn die Programme nicht mehr geändert werden, können diese auch in einem sogenannten Festwertspeicher untergebracht werden. Der Datenspeicherbereich  muss immer änderbar sein und wird deshalb immer in einem überschreibbaren Speicher liegen.
    Der Programmspeicher und der Datenspeicher müssen nicht zwingend im selben Speicherblock vereint sein. Es ist möglich, Programme und Daten in separaten Speicherblöcken unterzubringen. Je nach Art der Speicherverwaltung unterscheidet man zwischen zwei verschiedenen grundsätzlichen Architekturen eines Prozessors: der Architektur nach «von Neumann» und derjenigen nach «Harvard».
  • Der «Von Neumann-Rechner» arbeitet sequentiell, d.h. Befehle (Instruktionen) werden nacheinander abgeholt, interpretiert und ausgeführt und das Resultat wird anschliessend abgespeichert.
  • Bei der Harvard-Architektur sind Instruktionen und Daten in getrennten Speichern untergebracht. Der Prozessor besitzt getrennte Busse für Instruktions- und Datenzugriffe, dadurch kann ein überlappender Betrieb durchgeführt werden.
    Die nächste Instruktion kann bereits abgeholt werden, während noch Daten in den Speicher geschrieben werden. Der Aufwand für die Realisierung einer Harvard Architektur ist beträchtlich. Zahlreiche Pin-Anschlüsse (Kontakte) am Prozessor werden zusätzlich benötigt. Oft wird eine reine Harvard Architektur intern im Chip realisiert, nach aussen wir der gemeinsame Datenbus geführt.
  • Um mit der Aussenwelt zu kommunizieren, sind Peripheriebausteine nötig, die Signale erfassen und ausgeben können: Ein- und Ausgabeeinheiten.
  • Ein Taktgenerator (Clock-Generator) ermöglicht den Ablauf eines Programms in einem Mikrocomputer. Er dient auch als Zeitbasis für verschiedene andere Funktionen. Der Taktgeber teilt dem entsprechenden Gerät mit, dass es bei jedem Takt (Puls) eine weitere Funktion auszuführen hat. Der Taktgeber bestimmt damit z.B. wie schnell ein Programm abgearbeitet wird. Je schneller die Taktfolge, also je höher die Takt-frequenz, umso schneller wird ausgeführt.

1. Die Bestandteile

Die Hauptfunktion jedes Rechnersystems basiert auf dem EVA-Prinzip: Eingabe, Verarbeitung und Ausgabe. Die Verarbeitung findet in der  CPU (Central Processing Unit) statt und besteht aus Rechenwerk, Steuer-/Leitwerk und Speicher für Programme und Daten (Von-Neumann-Architektur).

  • CPU: Der Programm Counter verweist auf den aktuellen Programmschritt.
    Nach jeder Befehlsausführung wird der Programm Counter um 1 erhöht. Es ist aber auch möglich, durch einen Befehl den Programm Counter neu zu setzen.
    Im 8 Bit-Feld Instruktion/Adresse steht der anliegende Maschinenbefehl inkl. Adresse. Akkumulator/Register ist der unmittelbare Speicher, in den die CPU Resultate lädt und speichert. Die CPU arbeitet in zwei Takten:
    Fetch: (1. Takt)
    Der abzuarbeitende Maschinenbefehl wird vom RAM in die CPU geladen.
    Execute: (2. Takt)
    Die CPU führt die Instruktion (Maschinenbefehl) aus.
    Diese CPU kennt 10 unterschiedliche Befehle (Instruktionssatz)
  • RAM: Besteht aus 16 x 8 Bit bzw. 128 Bit oder 16 Byte. Die einzelne Speicherstelle wird über einen 4 Bit Adressbus angesprochen.
    Es ist immer nur eine Zeile aufs Mal betroffen. Die CPU „befiehlt“, welche Zeile es ist. Je nach CPU-Befehl werden Daten vom RAM gelesen oder dorthin gespeichert.
  • I/O: Wenn die CPU eine Eingabe oder Ausgabe von der Peripherie verlangt, ist das I/O betroffen. (I/O = Input/Output)

2. Der Maschinen-Befehlssatz

3. Maschinencode-Beispiel → Zwei Zahlen addieren

Das folgende Beispiel zeigt ein Programmablauf, bei dem zwei Werte aus dem Speicher gelesen, danach addiert und wieder in den Speicher zurückgeschrieben werden:

4. Maschinencode-Beispiel → Einfacher +/- Taschenrechner

Das folgende Beispiel zeigt einen kleinen Taschenrechner mit einer Additions/Subtraktions-Funktion. Dazu werden zwei Werte und die gewählte Operation +/- aus dem I/O gelesen, verarbeitet und wieder in das I/O zurückgeschrieben:

5. Unterschied zu realem Mikroprozessorsystem

Was unterscheidet nun unser "vereinfachter Micro-Computer zu Studienzwecken" von aktuellen Mikroprozessorsystemen?

  • Mehr RAM-Speicherplatz. Bedingt breiteren Adress- und Datenbus!
  • Mehrere Register in der CPU. Damit könnte man Werte auch im Register belassen anstatt sie sofort wieder ins RAM zurückschreiben zu müssen.
  • Mehrere I/O’s, damit gelichzeitig Werte anliegen dürfen.
  • Grösserer Instruktionssatz bzw. Maschinenbefehle. Unsere jetzige Maschine besitzt eigentlich nur zwei mathematische Operationen. Binäre Operatoren (AND, OR, Inverter etc.) fehlen gänzlich. Ebenfalls die sehr nützliche Bit-Shift-Funktion, die unbedingt auch mit an Bord sein müsste.
  • Ein System zum Unterbrechen eines laufenden Prozesses. (Interrupt, Multitasking)