4.3 Assembler. Assembler als leicht verständliche hardwarenahe Sprache Prozessor-Datenpfad

Ähnliche Dokumente
RO.RO, ADD RO, 120,121 MUL 120,120,121 INPUT RO, MUL INPUT 120,0 ADD RO, INPUT 121,1 INPUT R 1,2 INPUT 121,2 RO, IN put 121,1 N RO, ROIRA SET 121,3

4.3 Assembler 207 SET R0,0 INPUT R1,0 MUL R1,R1,R1 ADD R0,R0,R1 INPUT R1,1 MUL R1,R1,R1 ADD R0,R0,R1 INPUT R1,2 MUL R1,R1,R1 ADD R0,R0,R1 SQRT R0,R0

4.2 Universalrechner: Schaltung unabhängig vom Problem 185

6 MMIX-Prozessor MMIX-Prozessor

5 Befehlssätze und deren Klassifikation

6 MMIX-Prozessor MMIX-Prozessor

Nachfolgende Abbildung zeigt das Spezialregister ra, das Arithmetische Status Register. Interrupt Enable (Freischalten)

Assembler als Übersetzer

6 MMIX-Prozessor MMIX-Prozessor

T c) Daten welcher Größenordnung kann ein Register aufnehmen: Byte, kilobytes, megabytes, gigabytes or terabytes?

Nachfolgende Abbildung zeigt das Spezialregister ra, das Arithmetische Status Register. Interrupt Enable (Freischalten)

3.8 Sequentieller Multiplizierer 167

Speicher. T c) Daten welcher Größenordnung kann ein Register aufnehmen: Byte, kilobytes, megabytes, gigabytes or terabytes? einige Byte.

4. TÜ-Zusammenfassung zum Modul Computersysteme

6 MMIX-Prozessor. 6.1 Programmiermodell. S.219 alles wichtig. 6.2 Register. Allzweckregister

Assembler als Übersetzer

Dividend / Divisor = Quotient + Rest 9876 : 0054= : 0054= = -10 (negativ bleibt bei 1 mal) 4476 : 0054=018

T e) Welche Eigenschaft müssen Byte-, Wyde-, Tetra- und Octa-Adressen beim MMIX haben?

Kap.2 Befehlsschnittstelle. Prozessoren, externe Sicht

4 Prozessor-Datenpfad 4.1 Vom zu lösenden Problem abhängige Schaltung

Nachfolgende Abbildung zeigt das Spezialregister ra, das Arithmetische Status Register. Interrupt Enable (Freischalten)


Grundlagen der Rechnerarchitektur. Einführung

Übungsblatt 10 (Block C 2) (16 Punkte)

Beim Programmieren mit MMIX habt ihr vielleicht schon öfter eine der folgenden Fehlermeldungen von MMIXAL bekommen:

Assembler Programmierung Motivation. Informatik II SS 2004 Teil 4: Assembler Programmierung. Assembler vs. Maschinensprache

Vorlesung Rechnerarchitektur. Einführung

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen

T e) Wie wird im Speicher an der Adresse 0x die 32 Bit-Zahl

Welche Register werden zur Parameterübergabe verwendet? In welcher Reihenfolge werden die Parameter auf dem Stack bzw. in den Registern abgelegt?

Teil 2: Rechnerorganisation

Zur Multiplikation von Gleitkommazahlen müssen die Mantissen inkl. führender 1, als Festkommazahlen multipliziert werden.

Arithmetik, Register und Speicherzugriff. Grundlagen der Rechnerarchitektur Assembler 9

N Bit Binärzahlen. Stelle: Binär-Digit:

SUB $2,$5,10 Zeile 1 LDO $5,$0,2*8 Zeile 2 OR $1,$2,$3 Zeile 3 SRU $1,$5,$1 Zeile 4.

E Mikrocontroller-Programmierung

Grundlagen der Rechnerarchitektur. MIPS Assembler

2.1 Rechnersichten 2.2 Rechnerorganisation: Aufbau und Funktionsweise

Teil 1: Prozessorstrukturen

Rechnergrundlagen SS Vorlesung

Von Assembler zu Java

68000 Assembler. WAS ist ein Assembler? Ein System, das den Programmierer hilft, eine maschinennahe Programmierung zu realisieren.

Zusammenhang Interrupt, Befehlszyklus, indirekte Adressierung und Mikroprogramm [Stallings, Kap. 15, S ]

Technische Informatik - Eine Einführung

1 Rechnerstrukturen 1: Der Sehr Einfache Computer

1. TÜ-Zusammenfassung zum Modul Computersysteme

ARM-Cortex-M4 / Thumb-2-Befehlssatz Adressierungsarten und arithmetische Operationen

Rechnerstrukturen 1: Der Sehr Einfache Computer

Musterlösungen Technische Informatik 2 (T2) Prof. Dr.-Ing. D. P. F. Möller

3. Grundlagen der Rechnerarchitektur

Assembler am Beispiel der MIPS Architektur

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

Heute nur MIPS-Praxis (4 Aufgaben)

Teil 1: Prozessorstrukturen

3.1 Architektur des von-neumann-rechners. 3. Grundlagen der Rechnerarchitektur

Schriftliche Prüfung

Übung Rechnerstrukturen. Aufgabenblatt 10 Ausgabe: , Abgabe: :00. Aufgabe 10.1 (Punkte 25) Gruppe Matrikelnummer(n)

Computeranwendung in der Chemie Informatik für Chemiker(innen) 3. Software

1 Aufgaben Wie funktioniert ein Computer. a) Welche Spannungen werden von PC-Netzteilen bereitgestellt? 5W, 12W,

"Organisation und Technologie von Rechensystemen 4"

10. Die Adressierungsarten des MSP 430

Kap.3 Mikroarchitektur. Prozessoren, interne Sicht

4. Mikroprogrammierung (Firmware)

9. Die Adressierungsarten des MSP 430

Lehrveranstaltung: PR Rechnerorganisation Blatt 8. Thomas Aichholzer

Wie groß ist die Page Table?

Rechnernetze und Organisation

Übungen zu Grundlagen der Rechnerarchitektur und -organisation: Bonusaufgaben Übung 8 und Präsenzaufgaben Übung 9

3.8 Sequentieller Multiplizierer 159

Teil 1: Prozessorstrukturen

PIC16 Programmierung in HITECH-C

Praktikum Mikrorechner 4 (Bitmanipulation und Spezialregister)

Prozessorarchitektur. Kapitel 1 - Wiederholung. M. Schölzel

Offenbar hängt das Ergebnis nur von der Summe der beiden Argumente ab...

Mikrocomputertechnik. Thema: Der Aufbau des XC888-Mikrocontrollers -Teil 1 -

Übung Praktische Informatik II

Inhaltsangabe 3.1 Zahlensysteme und Darstellung natürlicher Zahlen Darstellung ganzer Zahlen

Hochschule Düsseldorf University of Applied Sciences HSD RISC &CISC

Technische Informatik II Rechnerarchitektur

, 2014W Übungsgruppen: Mo., Mi.,

Informatik 12 Kapitel 3 - Funktionsweise eines Rechners

Name: Vorname: Matr.-Nr.: 4. a) RISC-Architekturen müssen zur Decodierung von Maschinenbefehlen stets ein mikroprogrammierbares Steuerwerk verwenden.

Programmiersprachen Einführung in C

8. Beschreibung des Prozessors MSP 430

Vorstellung (Wdh. für die Neuen )

Grundlagen der Rechnerarchitektur

2. Computer (Hardware) K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16

Technische Informatik II Rechnerarchitektur

Projekt 3 Variablen und Operatoren

Der von Neumann Computer

PicAxe M2 - Das Speicherkompendium. Ausgabe Matthias Heuschele / SSE

Datenpfad einer einfachen MIPS CPU

A ProgrAmmer s Guide to KIM Programming

Mikrocomputertechnik

3. Grundlagen der Rechnerarchitektur. Praktische Informatik 2. Wolfgang Effelsberg

ERA-Zentralübung Maschinenprogrammierung

Lösungsvorschläge zur Übungsklausur. zum Kurs 1708 Technische Informatik II. im WS 01/02

Transkript:

24 4 Prozessor-Datenpfad 4.3 Assembler Die Programmierung des Universalrechners durch Niederschreiben der einzelnen Befehlswort-Bits aller Befehle ist sehr aufwendig. Aus diesem Grund wird dieser Schritt in der Regel durch ein Computerprogramm, dem sog. Assembler (engl. to assemble = zusammenbauen), übernommen. Assembler als leicht verständliche hardwarenahe Sprache Der Programmierer kann Programme in einer hardwarenahen, jedoch für den Menschen leicht verständlichen Sprache schreiben. Die Sprache wird ebenso wie das Übersetzer- Programm umgangssprachlich oft Assembler genannt. Unser Universalrechner verarbeitet zwei Quelloperanden zu einem Zieloperand. Befehle in einer hardwarenahen Sprache für den Universalrechner müssen also bis zu drei Operanden spezifizieren (aus welchen Quell-Registern kommen die Operanden, wo soll das Ergebnis abgespeichert werden?), aber auch die auszuführende Operation (Addieren, Subtrahieren,...). Ein Assembler-Programm zur Berechnung der quadratischen Gleichung auf unserem Universalrechner könnte dann beispielsweise wie folgt geschrieben werden: INPUT R1, // R1 a INPUT R2,1 // R2 b INPUT R3,2 // R3 c MUL R4,R2,R2 // R4 b 2 SET R5,4 // R5 4 MUL R5,R5,R1 // R5 4 a MUL R5,R5,R3 // R5 4 a c SUB R4,R4,R5 // R4 b 2 4 a c p SQRT R4,R4 // R4 b 2 4 a c SET R5, // R5 SUB R5,R5,R2 // R5 b ADD R6,R5,R4 // R6 b + p b 2 4 a c p SUB R7,R5,R4 // R7 b b 2 4 a c SET R,2 // R 2 MUL R,R1,R // R 2 a DIV R1,R6,R // R1 ( b + p b 2 4 a c)/(2 a) p DIV R2,R7,R // R2 ( b b 2 4 a c)/(2 a)

4.3 Assembler 25 Diese Schreibweise meint genau dasselbe wie die in den Aufgaben zuvor bitweise spezifizierten Befehlsworte, ist für den Menschen aber viel einfach lesbar. Um solche Assembler-Programme auf dem Universalrechner auszuführen, müssen diese jedoch zunächst mit dem Assembler in Befehlsworte übersetzt werden. Definition einer Assembler-Sprache für den Universalrechner Leere Programmzeilen, d.h. Zeilen, die nur Leerzeichen, Tabulatorzeichen und Zeilenumbruch-Zeichen enthalten, können zur Strukturierung eingefügt werden, werden aber vom Universalrechner nicht ausgeführt bzw. vom Assembler ignoriert. Wenn eine Zeile nicht leer ist, dann spezifiziert das erste in der Zeile vorkommende Wort (also alle Zeichen bis zum ersten Leerzeichen oder Tabulator) den Befehl (Multiplizieren, Subtrahieren,...), und das zweite in der Zeile vorkommende Wort die Operanden: die Operanden werden durch Komma getrennt; der erste Operand ist immer der Ziel-Operand, die folgenden Operanden sind Quelloperanden. Alle folgenden Worte sind Kommentare und werden vom Assembler ignoriert und somit vom Universalrechner nicht ausgeführt. Befehle und Operanden: INPUT: Liest Daten von den Eingängen des Rechners (Eingänge, 1 und 2 des Multiplexers M1) ein und speichert diese in einem Register ab; der erste Operand ist das Zielregister, der zweite Operand spezifiziert den Eingang (, 1 oder 2). ADD, SUB, MUL, DIV: Führen entsprechende arithmetische Operation durch; der erste Operand ist das Zielregister, die anderen beiden Operanden die Quellregister. SQRT: Zieht die Wurzel; der erste Operand ist das Zielregister, der zweite Operand das Quellregister. SET: Schreibt eine 1 Bit breite vorzeichenbehaftete Konstante in ein Register; der erste Operand ist das Zielregister, der zweite Operand die Konstante.

26 4 Prozessor-Datenpfad Qnades a) Schreiben Sie für den Universalrechner ein Programm in Assembler-Sprache, welches die drei Seiten eines Würfels - von den Eingängen, 1 und 2 einliest, das Volumen des Würfels berechnet und das Ergebnis im Register R ablegt. 12, NPWT 121,1 QNFDNTPSUT MML RO, 12,121 INPUT 121,2 MUL 12,12,121 b) Schreiben Sie für den Universalrechner ein Programm in Assembler-Sprache, welches den Mittelwert der an den Eingängen, 1 und 2 anliegenden Werte berechnet und diesen im Register R ablegt. INPUT 12, Wput 121,1 ADD RO, 12,121 INPUT 121,2 ADD 12,12,121 SET RM 3 DIV 12, RO, 121

4.3 Assembler 27 c) Schreiben Sie für den Universalrechner ein Programm in Assembler-Sprache, welches die an den Eingängen, 1 und 2 anliegenden Koordinaten eines Vektors im dreidimensionlen Raum einliest, den Betrag des Vektors berechnet und das Ergebnis in Register R ablegt. SET RO, INPUT 121, MUL 121,121,121 APD RO, RO, Rtl INPUT 121,1 MUL 121,121,121 ADD RO, RO, Rtl IN put 121,2 MUL 121,121, Rtl ADD RO, RO, 121 SQRT RO, RO

28 4 Prozessor-Datenpfad d) Schreiben Sie für den Universalrechner ein Programm in Assembler-Sprache, welches den Radius eines Kreises vom Eingang einliest, die Fläche des Kreises berechnet und das Ergebnis in Register R ablegt. Verwenden Sie für den Wert I 3,141592 in der angegebenen Genauigkeit. INPUT 12, MUL Ro, RO.RO Roth SET 121,314 SET 122,1 MUL 121,121,122 121<-314 R 3,159 ADD 121,121,123,21 SET # 124,2 MUL 12,12,121 314159 124,1 MUL 121,121,124 SETINTPUT SET 121T 314159 ADD 121,121,124 121 3141592 DIV 12,12,122 DIV 12,12,122

4.3 Assembler 29 T e) Schreiben Sie für den Universalrechner ein Programm in Assembler-Sprache, welches die Längen der beiden Katheten eines rechtwinkligen Dreiecks über die Eingänge und 1 einliest, die Länge der Hypothenuse berechnet und das Ergebnis im Register R ablegt T f) Schreiben Sie für den Universalrechner ein Programm in Assembler-Sprache, welches den Radius eines Kreises vom Eingang einliest, den Umfang des Kreises berechnet und das Ergebnis in Register R ablegt. Verwenden Sie für den Wert 3,141592 in der angegebenen Genauigkeit.

21 4 Prozessor-Datenpfad Assembler als Übersetzer Um ein Assembler-Programm für den Universalrechner zu übersetzen, iteriert der Assembler der Reihe nach über alle Programmzeilen und führt für jede Zeile folgendes aus: Wenn die Programmzeile leer ist (nur Leerzeichen, Tabulatorzeichen und Zeilenumbruch-Zeichen enthält), wird die Zeile ignoriert. Wenn die Programmzeile nicht leer ist, wird das erste Wort (alle Zeichen bis zum ersten Leerzeichen oder Tabulator) als Befehls-Zeichenkette interpretiert und das zweite Wort als Operanden-Zeichenkette; die Operanden-Zeichenkette wird bei den Kommas in zwei bzw. drei Operanden aufgetrennt; entspricht die Befehls-Zeichenkette der Zeichenkette INPUT, wird vom erste Operanden das R entfernt, das übrigbleibende Zeichen in eine Zahl gewandelt und diese im Befehlswort als D abgespeichert (z.b. D = 1 für R1, D = 1 für R2,...) der zweite Operand im Befehlswort als M1 abgespeichert (z.b. M1 =, falls zweiter Operand den Wert hat) entspricht die Befehls-Zeichenkette den Zeichenketten ADD oder SUB oder MUL oder DIV, wird von den drei Operanden das R entfernt und die übrig bleibenden Zahlen im Befehlswort als D (erster Operand), M3 (zweiter Operand) und M4 (dritter Operand) abgespeichert, und der Wert von M2 bei ADD auf 1 2 gesetzt, bei SUB auf 1 2, bei MUL auf 11 2, bei DIV auf 1 2, und M1 auf 11 2 gesetzt; entspricht die Befehls-Zeichenkette der Zeichenkette SQRT, wird von beiden Operanden das R entfernt und die übrig bleibenden Zahlen im Befehlswort als D (erster Operand) bzw. M4 (zweiter Operand) abgespeichert M2 auf 11 2 und M1 auf 11 2 gesetzt;

4.3 Assembler 211 entspricht die Befehls-Zeichenkette der Zeichenkette SET, wird vom ersten Operanden das R entfernt und die übrig bleibende Zahl im Befehlswort als D abgespeichert der zweite Operand in K abgespeichert (z.b. 1 2 für 1 oder 1111111111 2 für 1 M2 auf 2 und M1 auf 11 2 gesetzt. Neben dieser Grundfunktionalität würde ein richtiger Assembler auch noch diverse Fehlerüberprüfungen durchführen, beispielsweise ob nur gültige Befehle und Operanden verwendet wurden, ob alle Operanden angegeben sind, ob das Format der Operanden stimmt, ob die Konstanten nicht zu groß sind etc. Das Grundprinzip jedoch ist immer das selbe: Assembler-Programme werden durch eine eindeutige Abbildungsregel in Befehlsworte übersetzt. Betrachten Sie die folgende Codesequenz: INPUT R, MUL R,R,R INPUT R1,1 MUL R1,R1,R1 ADD R,R,R1 SQRT R,R Befehlsformat: K (1 Bit) D (3 Bit) M4 (3 Bit) M3 (3 Bit) M2 (3 Bit) M1 (2 Bit) a) Übersetzen Sie das Programm in Befehlsworte des Universalrechners mit Hilfe obiger Übersetzungsregeln. Geben Sie für alle irrelevanten Bits x an

212 4 Prozessor-Datenpfad Betrachten Sie die folgende Codesequenz: MUL R,R,R1 SET R1,255 DIV R1,R,R2 ADD R1,R1,R3 b) Übersetzen Sie das Programm in Befehlsworte des Universalrechners mit Hilfe obiger Übersetzungsregeln. Geben Sie für alle irrelevanten Bits x an Betrachten Sie die folgende Codesequenz: SET R, INPUT R1, ADD R,R,R1 INPUT R1,1 ADD R,R,R1 INPUT R1,2 ADD R,R,R1 SET R1,3 DIV R,R,R3 T c) Übersetzen Sie das Programm in Befehlsworte des Universalrechners mit Hilfe obiger Übersetzungsregeln. Geben Sie für alle irrelevanten Bits x an

4.3 Assembler 213 Betrachten Sie den Datenpfad des Universalrechners. SUB b a a-b MUL ADD DIV b a a/b 1 2 3 7 6 5 4 3 1 2 3 1 2 3 4 2 1 1 2 3 7 6 5 4 3 2 1 1 2 3 1 2 3 D11 3 D6 D5 3 D3 D2 3 A7 A D1 D 2 M1 M4 M3 M2 a b c Add 1 1 clk reset 1 2 3 7 6 5 4 3 2 1 D13 D12 R7 R6 R5 R4 R3 R2 R1 R 3 M1 M2 M3 M4 D 1 BZ p 5 M3 A2 A1 M4 M2 M1 M D4 D7 D8 D1 D9 D23 D14 D R K MSB 1 1 n-1 n F ISRDIV

214 4 Prozessor-Datenpfad Gegeben ist folgende Codesequenz: SET R,5 INPUT R4,2 ADD R,R,R1 DIV R7,R,R1 d) Übersetzen Sie das Programm in Befehlsworte des Universalrechners lediglich mit Hilfe des Datenpfads (ohne Übersetzungsregeln). Geben Sie für alle irrelevanten Bits x an Gegeben ist folgende Codesequenz: SET R1,2 SQRT R2,R1 INPUT R2,1 MUL R5,R,R1 T e) Übersetzen Sie das Programm in Befehlsworte des Universalrechners lediglich mit Hilfe des Datenpfads (ohne Übersetzungsregeln). Geben Sie für alle irrelevanten Bits x an

215 5 Befehlssätze und deren Klassifikation Befehlssatz Unser Universalrechner kennt 7 verschiedene Befehle: ADD, SUB, MUL, DIV, FSQRT, INPUT und SET. Die Menge (im mathematischen Sinne) der Befehle, die ein Prozessor versteht, nennt man auch den Befehlssatz (Satz im Sinne von Menge; engl.: instruction set) des Prozessors. Befehlssätze lassen sich in mehrfacher Hinsicht klassifizieren. Klassifikation nach Komplexität CISC = Complex Instruction Set Architecture CISC-Befehlssätze enthalten sehr mächtige, komplexe Befehle, um mit möglichst wenig Assembler-Code viel zu erreichen. Beispiel: Laden von zwei Operanden aus dem Speicher, Multiplikation der Operanden, Abspeichern des Ergebnisses im Speicher als ein Befehl. Dieses Prinzip war in den 197er-Jahren gängig, da die verfügbaren Speicher sehr klein waren und so weniger Platz benötigt wurde. Zudem gab es noch keine (vernünftigen) Compiler, d.h. Programme wurde in Assembler-Sprache geschrieben. Durch die mächtigen Befehle ging das Programmieren schneller, da sich die Befehle fast wie eine Hochsprache verhielten. Durch die Unterschiedlichkeit der Befehle ist das Befehlswort bzgl. der Länge variabel, d.h. die Befehlswortbreite schwankt je nach Befehl z.b. zwischen 1 und 16 Byte. RISC = Reduced Instruction Set Architecture Bei RISC-Befehlssätzen ist die Mächtigkeit der Befehle stark reduziert. Komplexe Operationen werden durch mehrere einfachen Befehlen gelöst, statt durch einen sehr mächtigen Befehl. Beispiel Multiplikation zweier im Speicher liegender Zahlen: 2 Lade-Befehle, um Operanden vom Speicher in Register zu laden 1 Multiplikation-Befehl, der zwei Register-Werte multipliziert und das Ergebnis wieder in einem Register abspeichert 1 Speicher-Befehl, um das Ergebnis vom Register in den Speicher zu schreiben Durch Compiler und Programmierung in Hochsprache ist die Mächtigkeit einzelner Befehle nicht mehr ausschlaggebend für die Programmiereffizienz. Durch die Verfügbarkeit größerer Speicher besteht keine Notwendigkeit mehr, Speicher durch mächtige Befehle zu sparen. Die Befehle eines RISC-Prozessors haben in der Regel alle die selbe Befehlswortlänge bzw. nur wenige verschiedene Wortbreiten. Beispiel: 4 Byte für Speicherbefehle und

216 5 Befehlssätze und deren Klassifikation 2 Byte für alle anderen Befehle. Das macht die Hardware einfacher und damit auch schneller. Klassifikation nach Verortung der Operanden Register-Speicher-Architektur Bei einer Register-Speicher-Architektur können die Operanden der Befehle sowohl in Registern, als auch im Speicher stehen. Register-Register-Architektur/Load-Store-Architektur Bei Register-Register-Architekturen müssen Quell- und Zieloperand in Registern stehen. Quelloperanden, die im Speicher stehen, müssen zunächst mit einem Lade-Befehl (engl. load instruction) vom Speicher in ein Register geladen werden, bevor sie verarbeitet werden können. Soll das Ergebnis eines Befehls im Speicher abgelegt werden, so muss das Ergebnis zunächst in einem Register abgelegt werden, bevor es mit einem Speicher-Befehl (engl. store instruction) vom Register in den Speicher geschrieben werden kann. Da Speicherzugriffe nur über Lade- und Speicher-Befehle erfolgen, nenn man Register- Register-Architekturen auch Load-Store-Architekturen. Klassifikation nach der Anzahl der Operanden Drei-Adress-Maschine Bei einer Drei-Adress-Maschine können bis zu zwei Quell- und ein Zieloperand explizit angegeben werden. Da das bei unserem Universalrechner ebenfalls möglich war, ist unser Universalrechner eine Drei-Adress-Maschine. Beispiel: ADD R,R1,R2, addiere Register R1 zum Register R2 und speichere das Ergebnis in Register R ab. Zwei-Adress-Maschine Bei einer Zwei-Adress-Maschine ist ein Quell-Operand gleichzeitig auch Zieloperand. Beispiel: ADD R,R1, addiere Register R zum Register R1 und speichere das Ergebnis in Register R ab. Ein-Adress-Maschine/Akkumulator-Maschine Bei einer Ein-Adress-Maschine wird nur ein einziger Quell-Operand angegeben. Zweiter Quell-Operand und Ziel-Operand ist implizit immer das sog. Akkumulator-Register. Beispiel: ADD R1, addiere Register R1 zum Akkumulator-Register und speichere das Ergebnis wieder im Akkumulator-Register ab.

217 Null-Adress-Maschine/Stack-Maschine Bei einer Null-Address-Maschine muss bei einer Operation kein Operand angegeben werden, da als Operand immer implizit die auf einem Stack oben liegenden Werte verwendet werden. Das Ergebnis wird wieder auf dem Stack abgelegt. Beispiel: push 3 push 4 add Zunächst wird die Zahl 3 auf dem Stack abgelegt, danach die Zahl 4. Anschließend werden beide Zahlen addiert. Das Ergebnis wird wieder auf dem Stack abgelegt.

218 6 MMI-Prozessor 6 MMI-Prozessor In diesem Kapitel beschäftigen wir uns mit dem MMI-Prozessor. Der MMI-Prozessor wurde von Donald Ervin Knuth zu Lehr- und Forschungszwecken an der Stanford University entwickelt. Donald Knuth ist Mathematiker und ein berühmter Computer-Pionier. Von ihm stammen unter anderem die berühmten Bücher The Art of Computer Programming sowie das Text-Satzsystem TE, ein Vorfahre von L A TE, mit dem z.b. dieses Skript erstellt wurde. Für mehr Infos, siehe http://www-cs-faculty.stanford.edu/~uno/. MMI steht für die römische Zahl 29, die sich als Mittelwert mehrerer RISC-Rechner- Kennzahlen ergibt: (CrayI + IBM81 + RISCII + ClipperC3 + AMD29K + Motorola88K + IBM61 + In-teli96 + Alpha21164 + POWER2 + MIPSR4 + HitachiSuperH4 + StrongARM11 + Sparc64) / 14 = 28126 / 14 = 29. MMI ist ein Prozessor-Modell, d.h. kein real existierender Prozessor. Damit gibt es keine Legacy-Effekte aufgrund gewünschter Rückwärtskompatibilitäten, was nicht nur die Programmierung, sondern auch die Implementierung des Prozessors sehr einfach und verständlich macht. Simulations-Tools zum MMI-Prozessor können von der LDV- Webseite heruntergeladen werden. Der MMI ist eine Register-Register-Architektur mit 256 Allzweck-Registern und 32 Spezial-Registern. Die Wortbreite beträgt 64 Bit (Register, Rechenwerk, Daten- und Adress-Busse), der Adressbereich umfasst 2 64 Byte. Der Befehlssatz umfasst 256 Befehle. Für alle Befehle beträgt die Befehlswortlänge 32 Bit. Donald Knuth gibt für die Ausführungszeit der meisten Befehle 1 Takt an, was typisch für RISC-Prozessoren ist. Diese Ausführungszeit bezieht sich jedoch auf den von Donald Knuth erstellten Simulator und nicht auf die von uns entwickelte Datenpfad-Realisierung.

6.1 Programmiermodell 219 6.1 Programmiermodell 32 Spezialregister 256 Allzweckregister Speicher 64 Bit 64 Bit 8 Bit PUT LDx 1 1 1 31 64 Bit GET 8, 16, 32, 64 Bit STx 32 Bit Befehlswort 255 OP Y Z 64 Bit 64 Bit 8, 16, 24 Bit ALU STCO 2 64-1 Die Operanden, die vom Rechenwerk (ALU = Arithmetic Logic Unit) verarbeitet werden, entstammen entweder den Allzweckregistern (64 Bit Wortbreite) oder direkt dem Befehlswort (Direktoperand; 8, 16, 24 Bit). Ein vom Rechenwerk berechnetes Ergebnis (Zieloperand) wird immer in einem Allzweckregister abgelegt. Daten aus dem Speicher müssen erst mit Ladebefehlen (LDx) in ein Allzweckregister geladen werden, bevor Sie vom Rechenwerk verarbeitet werden können. Daten können mit Speicherbefehlen (STx) von einem Allzweckregister in den Speicher geschrieben werden. Die Wortbreite für Speicherzugriffe beträgt 8, 16, 32 oder 64 Byte. Für jede Wortbreite gibt es einen eigenen Lade- bzw. Speicherbefehl, was mit dem x bei LDx bzw. STx gekennzeichnet ist. Der Zugriff auf die Spezialregister erfolgt mit PUT (vom Allzweckregister ins Spezialregister schreiben) bzw. mit GET (Daten vom Spezialregister in ein Allzweckregister einlesen). Mit dem STCO-Befehl können 8 Bit breite Operanden vom Befehlswort in den Speicher geschrieben werden.

22 6 MMI-Prozessor 6.2 Register Die Register sind kleine, jedoch sehr schnelle Speicherelemente, die im Prozessor-Kern untergebracht sind. Die Wortbreite der Register entspricht typischerweise der Breite der Datenworte, die vom Prozessor verarbeitet werden können. Beim MMI sind die Register 64 Bit groß. Allzweckregister Allzweckregister (engl. general purpose register) sind Register, die keinen bestimmten Zweck haben, sondern universell verwendet werden können. Gemeint ist, dass diese Register als Operanden für alle Befehle verwendet werden können. Es gibt bei Allzweckregistern also keine festgelegte Bindung zwischen einem bestimmten Register und einer bestimmten auszuführenden Operation (z.b. Festkomma-Addition, Basis-Adresse für Speicherzugriff,...). Die 256 Allzweckregister des MMI haben keine besonderen Namen, sondern werden von bis 255 durchnummeriert und über diese Nummer angesprochen. Um Register von Zahlen unterscheiden zu können wird der Registernummer ein Dollarzeichen vorangestellt. $ meint also den Inhalt von Register, während die Zahl meint. Computerprogramme verwenden sowohl globale als auch lokale Variable: Globale Variable können von allen Programmteilen verwendet werden, lokale nur von einem Teilausschnitt, z.b. einer Funktion. Beim MMI werden lokale Variable in den unteren Allzweckregistern ($, $1,... = lokale Register) und globale Variable in den oberen Allzweckregistern ($255, $254,... = globale Register) abgelegt. Die dazwischen liegenden unbenutzten Register werden beim MMI marginale Register genannt. Die Nummer des ersten freien lokalen Registers ist in Spezialregister rl abgelegt, die Nummer des ersten globalen Registers in Spezialregister rg. $255 $(rg) Globale Register Marginale Register $(rl) $ Lokale Register

6.2 Register 221 Spezialregister Spezialregister (engl. special purpose registers) haben im Gegensatz zu Allzweckregistern einen bestimmten Zweck, d.h. jedes Spezialregister hat seine ganz eigene Aufgabe. Spezialregister können als eine Art Schnittstelle zwischen Hardware und Software angesehen werden, die es der Software ermöglicht, bestimmte Hardware-Einstellungen vorzunehmen (z.b. Setzen von Taktfrequenz-Multiplikatoren, Konfiguration von Interrupts,...) oder aufgetretene Ereignisse (z.b. Division durch, Zeitablauf bei Timer-Interrupt,...) durch die Software erfassbar/auswertbar zu machen. Der MMI-Prozessor hat 32 Spezialregister, die ra, rb, rc,... rz, rbb, rtt, rww r, ryy und rzz genannt werden. Zugriff auf die Spezialregister ist bei MMI nur über die Befehle PUT (Wert von Allzweckregister in Spezialregister kopieren) und GET (Wert von Spezialregister in Allzweckregister kopieren) möglich. :tp x x z Nachfolgende Abbildung zeigt das Spezialregister ra, das Arithmetische Status Register. Interrupt Enable (Freischalten) : :# t.u.nl Interrupt Event (Auftreten) R1 R D V W I O U Z D V W I O U Z nicht verwendet. # - Gleitkommazahl ungenau (z.b. 1. / 3.) Gleitkomma-Division durch Gleitkomma-Unterlauf Gleitkomma-Überlauf Unerlaubte Gleitkommaoperation, z.b. sqrt(-1.) Überlauf bei Wandlung Gleitkomma- in Festkommazahl Festkomma-Überlauf Festkomma-Division durch Gleitkomma-Rundungsmodus : Nächster Wert (standard) 1: Abrunden (Richtung ) 1: Aufrunden (Richtung + ) 11: Abrunden (Richtung - ) Beispiele für weitere Spezialregister: Im Falle einer Multiplikation 64 Bit 64 Bit = 128 Bit werden in rh die oberen 64 Bit des Ergebnisses abgelegt. Im Falle einer Division 128 Bit : 64 Bit = 64 Bit werden in rd die oberen 64 Bit des 128 Bit breiten Dividenden abgelegt. Bei einer Festkomma-Division wird in rr der Rest der Division abgelegt (Modulo- Operation).

222 6 MMI-Prozessor Verständnisfragen/Aufgaben Allgemein T a) Was ist ein Register? T b) Wo findet man Register in einem Computer-System? T c) Daten welcher Größenordnung kann ein Register aufnehmen: Byte, kilobytes, megabytes, gigabytes or terabytes? Allzweckregister a) Was sind Allzweckregister? Für beliebige Operationen, d.h. kein bestimmter Zweck b) Geben Sie ein Beispiel für eine typische Verwendung eines Allzweckregisters an. Quell - und Ziel operand für aithm.gs. c) Über wieviele Allzweckregister verfügt der MMI-Prozessor? Welche Namen haben sie? 256 $, $1,... $255

6.2 Register 223 T d) Was ist der Unterschied zwischen einem globalen und einem lokalen Register? Spezialregister a) Was ist ein Spezialregister? Hat b) Geben Sie eine typische Anwendung eines Spezialregisters an. T c) Über wieviele Spezialregister verfügt der MMI-Prozessor? Wie werden sie genannt (Prinzip)? spezielle Funktion, die in der Regel die Hardware steuert oder hfos über die Hardware bereitstellt Interrupt. ein oder Rest von Division ausschalten i ; Rundung modus festlegen T d) Kann jeder MMI-Befehl Spezialregister verwenden? T e) Welches Spezialregister stellt Informationen über Arithmetische Operationen zur Verfügung? T f) In welchem Spezialregister kann man die oberen 64 Bit eines 128 Bit breiten Festkomma-Dividenden ablegen?

224 6 MMI-Prozessor T g) In welchem Register werden die oberen 64 Bit des Ergebnisses einer Festkomma- Multiplikation abgelegt? T h) In welchem Spezialregister legt das Rechenwerk den Rest einer Festkomma- Division ab? i) Müssen normale Programme häufig auf Spezialregister zugreifen? in der Regel nicht so häufig j) Was müssen Sie tun, wenn Sie einzelne Bits eines Spezialregisters verändern wollen? Spezialregister - - Wert übertragen L mit GET ) - Wert ändern in Allzweck zeyiskr Wert mit - put in Spezialryisk. schreiben Die letzte Aufgabe hat gezeigt, dass zur Bearbeitung von Spezialregistern zwei zusätzliche Befehle ausgeführt werden müssen. Diese Ausführung kostet Zeit. k) Können Sie sich einen Grund vorstellen, warum nicht alle MMI-Befehle in Spezialregister schreiben bzw. Spezialregister lesen können? - Hardware wird einfacher schneller - Beschleunigung des häufig den Falls vorkommen -

6.3 Speicher 225 6.3 Speicher Der Speicher des MMI ist Byte-adressiert, d.h. das kleinste adressierbare Datenelement ist ein Byte (8 Bit). Wortbreiten. Das Speichern (Allzweckregister! Speicher; engl. store) bzw. Laden (Speicher! Allzweckregister; engl. load) wird in folgenden Wortbreiten unterstützt: 1 Byte (8 Bit) 2 Byte (16 Bit), beim MMI Wyde genannt, 4 Byte (32 Bit), beim MMI Tetra genannt, 8 Byte (64 Bit), beim MMI Octa genannt. AdresseAusrichtung der Daten im Speicher - Alignment 12345678 Bei Speichermodulen sind die einzelnen Byte in der Regel auf mehrere Speicherchips -64 verteilt, bei einer Wortbreite von 64 Bit kann ein Speichermodul (ohne Speicherung von Paritätsbits) beispielsweise aus 16 Chips zu je 4 Bit oder 8 Chips zu je 8 Bit aufgebaut sein. Betrachten Sie das nachfolgende (einseitige) Speichermodul, in dem 64 Bit breite Datenworte aus 8 Speichermodulen zu je 8 Bit aufgebaut werden (es werden keine # 61 Paritätsbits betrachtet). Adresse g g g g g g q g int & ( AED ) & ( am ) ALTEOII 1 2 3 4 5 6 7 "Y Bei Zugriffen auf ein einzelnes Byte wird nur auf einen einzigen Speicherchip zugegriffen. Dabei können die letzten drei Adressbits dazu verwendet werden, den Speicherchip auszuwählen und die übrigen Adressbits wählen dann eine " Adresse innerhalb des ausgewählten Chips aus. Bei Zugriffen auf 16 Bit breite Datenworte wählen die Adressbits 1 und 2 (das Adressbit wird nicht ausgewertet) eine der vier Speicherchip-Gruppen (,1), (2,3), (4,5) oder (6,7) aus. Die übrigen Adressbits (ab 3 aufwärts) wählen dann eine Adresse innerhalb der ausgewählten Chips aus. Das 16 Bit Datenwort setzt sich dann aus den 2 8 Bit der ausgewählten Speicherchip-Gruppe zusammen. z t.si t.si ' * : t.tt ü # # :b

226 6 MMI-Prozessor Bei Zugriffen auf 32 Bit breite Datenworte wählt das Adressbit 2 (Adressbits und 1 werden ignoriert) eine der zwei Speicherchip-Gruppen (,1,2,3) oder (4,5,6,7) aus. Die Adressbits 3, 4, 5,... wählen eine Adresse innerhalb der ausgewählten Chips aus. Das 32 Bit Datenwort setzt sich dann aus den 4 8 Bit der ausgewählten Speicherchip-Gruppe zusammen. Bei Zugriffen auf 64 Bit breite Datenworte werden die Adressbits, 1 und 2 ignoriert. Die übrigen Adressbits wählen eine Adresse innerhalb der ausgewählten Chips aus. Das 64 Bit breite Datenwort setzt sich dann aus den 8 8 Bit der ausgewählten Speicherchip-Gruppe zusammen. Aus mehreren Byte zusammengesetzte Daten werden also idealerweise so im Speicher ausgerichtet (engl. aligned), dass auf sie gemäß obigem Schema mit nur einem einzigen Speicherzugriff zugegriffen werden kann. Datenworte können prinzipiell natürlich auch anders abgelegt werden, bspw. kann ein 32 Bit breites Datenwort auch auf die Chips 1, 2, 3 und 4 verteilt werden. Der Nachteil hierbei ist jedoch, dass die Daten dann durch die Verdrahtung auf dem Speichermodul nicht automatisch richtig zusammengesetzt werden, sondern entweder durch zusätzliche Hardware oder durch Software-Befehle richtig zusammengefügt werden müssen. Aus diesem Grund werden aus mehreren Byte zusammengesetzte Datenworte in der Regel immer in der beschriebenen Weise ausgerichtet, sind also immer aligned. Der MMI unterstützt das beschriebene Alignment, indem er durch Löschen der niederwertigsten Adressbits die Menge gültiger Wortadressen wie folgt einschränkt: Byte Wyde Tetra Octa x x1 x2 x3 x4 x5 x6 x7 x8 x9 xa

6.3 Speicher 227 Das bedeutet: Bytes können an jeder Adresse abgelegt werden, Wydes können nur an Adressen abgelegt werden, die ein Vielfaches von 2 sind, Tetras können nur an Adressen abgelegt werden, die ein Vielfaches von 4 sind, Octas können nur an Adressen abgelegt werden, die ein Vielfaches von 8 sind. Big- und Little Endian Die Ausrichtung der Daten im Speicher (Alignment) beschreibt die Byte-Adressen, an denen aus mehreren Byte zusammengesetzte Datenworte abgelegt werden können. Ein 32 Bit breites Datenwort beginnt beispielsweise an einer durch 4 teilbarer Adresse und nimmt noch die nächsten vier Byte ein. Damit ist jedoch noch keine Aussage über die Adressen innerhalb der Menge der erlaubten Byte-Adressen getroffen, an der die verschiedenen Byte eines Datenworts abgelegt werden. Sollen die Byte eines aus mehreren Byte zusammengesetzten Datenworts der Reihe nach im Speicher abgelegt werden, gibt es zwei Möglichkeiten: Durch die (gültig ausgerichtete) Wort-Adresse wird das höherwertigste Byte adressiert. Das nennt man Big Endian. Durch die (gültig ausgerichtete) Wort-Adresse wird das niederwertigste Byte adressiert. Das nennt man Little Endian. Beispiele für Big-Endian Prozessoren sind MMI, MIPS, SPARC, Atmel AVR32 etc., Beispiele für Little-Endian-Prozessoren sind Intel x86, Renesas SH,... Beispiel: 32 Bit Zahl x1234567 an Adresse x : x x1 x2 x3 Big Endian x1 x23 x45 x67 Little Endian x67 x45 x23 x1

228 6 MMI-Prozessor Speicherorganisation Die Adressbreite des MMI beträgt 64 Bit, d.h. der MMI kann 2 64 Byte adressieren, von x bis xffff FFFF FFFF FFFF. Dieser Speicherbereich wird wie folgt aufgeteilt: x = Text_Segment x FF x 1 x1fff FFFF FFFF FFFF x2 = Data_Segment x3fff FFFF FFFF FFFF x4 = Pool_Segment x5fff FFFF FFFF FFFF x6 = Stack_Segment x7fff FFFF FFFF FFFF x8 Interrupt-Vektoren Text-Segment MMI-Befehle Globale Variable (Heap) Daten-Segment Lokale Variable, Stack Pool-Segment Stack-Segment Betriebssystem-Segment xffff FFFF FFFF FFFF Text-Segment: Programme und Interrupt-Vektoren Im Text-Segment wird ausführbarer Befehlscode als aufeinander folgende Befehlsworte abgelegt. Da alle Befehlsworte 4 Byte breit sind, beginnen die Befehlsworte immer an einer durch 4 teilbaren Adresse. MMI-Programme können ab Adresse x1 im Speicher abgelegt werden. An welcher Adresse ein Programm genau beginnt, ist in der Symboltabelle der Objektdatei festgelegt. Die Objektdatei enthält Befehlsworte für den jeweiligen Prozessor (hier: MMI), die vom Loader (Teil des Betriebssystems das auszuführende Programme in den Speicher lädt) beim Starten des Programms in das Textsegment geladen

6.3 Speicher 229 werden. Neben den Befehlen enthält die Objektdatei auch Informationen über Vorbelegungen des Speichers sowie die Symboltabelle. Die Symboltabelle spezifiziert eine Menge von (Name! Adresse)-Paaren, über die Einsprungspunkte in Module, Funktionen, Blöcke etc. gefunden werden können. MMI-Programme beginnen an der Adresse, die durch den Symboltabellen-Eintrag Main festgelegt ist. Von Adresse x bis xff ist die Interrupt-Vektor-Tabelle abgelegt. Die Interrupt-Vektor- Tabelle ist der Speicherbereich, in dem die Interrupt-Vektoren (s.u.) eines Prozessors abgelegt sind. Nachfolgende Abbildung zeigt den Aufbau der Interrupt-Vektor-Tabelle beim MMI. x x4 x8 xc x1 x14 x18 x1c x2 x24 x28 x2c x3 x34 x38 x3c x4 x44 x48 x4c x5 x54 x58 x5c x6 x64 x68 x6c x7 x74 x78 x7c x8 x84 x88 x8c Allgemeine Trips Division durch Null Integer-Überlauf Überlauf Gleitkomma- Festkomma-Wandlung Ungültige Gleitkoma- Operation Gleitkomma-Überlauf Gleitkomma-Unterlauf Gleitkomma-Division durch NULL Gleitkommazahl ungenau

23 6 MMI-Prozessor Interrupts sind (asynchrone) Programm-Unterbrechungen. Sie können auftreten, wenn ein Fehler aufgetreten ist (z.b. Division durch, Speicherzugriffsfehler), Zeitgeber (sog. Timer) abgelaufen sind, angeschlossene Geräte Daten empfangen haben etc. Interrupt-Service-Routinen (ISRs) sind Funktionen, die zur Behandlung der Interrupts aufgerufen werden. Beim Auftreten eines Timer-Interrupts können beispielsweise von einem angeschlossenen Gerät empfangene Daten verarbeitet werden, Meßwerte von einem externen Sensor eingelesen werden oder im Falle des Betriebssystem-Schedulers ein Prozess unterbrochen und ein anderer Prozess gestartet werden (time slicing). Interrupt-Service-Routinen sind wie normale Funktionen, werden jedoch nicht durch das laufende Software- Programm explizit (synchron) aufgerufen (wie z.b. printf() zur Ausgabe von Zeichen auf dem Bildschirm). Sie werden durch asynchron auftretende externe oder interne Ereignisse ausgelöst und durch die darauf folgende hardwarebasierte Änderung des Befehlszählers aufgerufen. Interrupt-Vektoren beschreiben für Interrupt-fähige Ereignisse die Adressen der zugehörigen ISRs, d.h. die Stellen im Speicher, an die der Prozessor im Fehlerfall automatisch verzweigen soll. Um im Ereignis-Fall automatisch in die entsprechende ISR zu verzweigen, muss in der Regel die Behandlung von Interrupts allgemein freigeschaltet sein (z.b. Bit globally enable interrupts in einem Spezialregister), aber auch das betreffende Ereignis (z.b. Division durch Null explizit zur Fehlerbehandlung durch Interrupts freigeschaltet sein; beim MMI beispielsweise über das betreffende Interrupt-Enable -Bit in ra. Für viele Fehler gibt es eigene Interrupt-Vektoren, wie z.b. bei Division durch Null. Andere Fehler werden oft zu einem allgemeinen Interrupt zusammengefasst. Es gibt verschiedene Möglichkeiten, die Sprungziele der ISRs durch die Interrupt-Vektoren zu beschreiben. Die gängigsten sind: Interrupt-Vektoren enthalten direkt die Adresse der ISR, Interrupt-Vektoren enthalten die Adresse der ISR indirekt, d.h. sie enthalten die Speicher-Adresse des Datenworts, in dem die ISR- Adresse steht, Interrupt-Vektoren enthalten vom Prozessor ausführbare Befehle; die Befehle enthalten entweder die ISR selbst, oder einen Sprungbefehl zur

6.3 Speicher 231 ISR. Dieses Verfahren wird auch beim MMI verwendet. Dazu werden in die Interrupt-Vektoren Befehle eingetragen, die in die jeweiligen ISRs verzweigen. Daten-Segment Das Datensegment dient zur Aufnahme von Daten, die während der Befehlsausführung anfallen bzw. verarbeitet werden. Globale und statische Daten sowie zur Laufzeit allozierte Daten werden auf dem Heap abgelegt. Dieser beginnt ab Adresse x2 und wächst in Richtung höherer Adressen. Lokale Daten werden auf dem Stack abgelegt, der bei Adresse x3fffffffffffffff bzw. x3ffffffffffffff8 (für Octas) beginnt und in Richtung niedrigerer Adressen wächst. Pool-Segment Das Pool-Segment ist ein Speicherbereich, der für den Datenaustausch zwischen Programm und Betriebssystem gedacht ist. Im Pool-Segment werden beispielsweise argv TOI 3 a. GVTD ignt main Lint argo, char # # argv ) char * argv LI Programmen ihre Aufruf-Parameter übergeben. Dazu wird bei Programmstart in Register die Anzahl der Parameter (argc = argument count) übergeben und in Register 1 die Adresse auf eine Null-terminierte Liste aus Zeigern, von denen jeder auf einen Parameter zeigt. Adresse x4 enthält die Adresse des ersten freien Pool-Segment-Datenworts. Nachfolgende Abbildung zeigt das Poolsegment beim Aufruf eines Programms skalprodarg mit den Parametern 4, 1, 2, 3, 4, 1, 2, 3 und 4. Adresse Wert (hex) Wert (ascii) x4 x4b8 @ \ \ \ µ \ \ \ x48 x46 @ \ \ \ \ \ \ ` x41 x47 @ \ \ \ \ \ \ p x418 x478 @ \ \ \ \ \ \ x x42 x48 @ \ \ \ \ \ \ Ç x428 x488 @ \ \ \ \ \ \ ê x43 x49 @ \ \ \ \ \ \ É x438 x498 @ \ \ \ \ \ \ ÿ x44 x4a @ \ \ \ \ \ \ á x448 x4a8 @ \ \ \ \ \ \ x45 x4b @ \ \ \ \ \ \ x458 x \ \ \ \ \ \ \ \ x46 x736b616c7726f64 s k a l p r o d x468 x617267 a r g \ \ \ \ \ x47 x34 4 \ \ \ \ \ \ \ x478 x31 1 \ \ \ \ \ \ \ x48 x32 2 \ \ \ \ \ \ \ x488 x33 3 \ \ \ \ \ \ \ x49 x34 4 \ \ \ \ \ \ \ x498 x313 1 \ \ \ \ \ \ x4a x323 2 \ \ \ \ \ \ x4a8 x333 3 \ \ \ \ \ \ x4b x343 4 \ \ \ \ \ \ x4b8 x \ \ \ \ \ \ \ \ L

232 6 MMI-Prozessor Stack-Segment Das Stack-Segment dient beim sog. Register-Stack des MMI zur Auslagerung von Registern. Dieses Segment wird von uns nicht verwendet. Betriebssystem-Segment Dieser Speicherbereich ist für das Betriebssystem vorgesehen. Durch die gewählte Aufteilung kann am höherwertigsten Adress-Bit direkt abgelesen werden, ob der ausgeführte Befehl zum Betriebssystem (kernel space) oder zu einem Benutzerprogramm (user space) gehört. Damit lässt sich ein zwei Stufen umfassendes Privilegierungs-System aufbauen, bei dem beispielsweise bestimmte Befehle nur vom Betriebssystem verwendet werden dürfen oder Zugriffe auf bestimmte Resourcen (Register, angeschlossene Geräte,...) nur dem Betriebssystem erlaubt sind.

6.3 Speicher 233 Virtueller Speicher Die gezeigte Einteilung des Speichers in verschiedene Segmente bezieht sich auf den sog. virtuellen Speicher. Virtueller Speicher meint, dass die Speicheradressen, auf die ein Programm zugreift, nicht den realen, physikalischen Speicheradressen entsprechen. Die Umwandlung erfolgt durch die Hardware und wird vom Betriebssystem durch Einstellungen in Spezialregistern gesteuert. Auf diese Weise gaukelt das System einem Programm z.b. einen 64 Bit großen Adressraum vor, obwohl beispielsweise nur 8 GB Arbeitsspeicher im System installiert sind. Durch die vom Betriebssystem überwachte Abbildung von virtuellen auf reale Adressen kann ein Programm auf jede beliebige Speicheradresse zugreifen ohne mit dem Speicher anderer Programme zu kollidieren. Virtueller Speicher dreier Programme realer Speicher Interrupt-Vektoren MMI-Befehle Text-Segment Interrupt-Vektoren Globale Variable (Heap) Text-Segment Daten-Segment MMI-Befehle Lokale Variable, Stack Interrupt-Vektoren Pool-Segment Globale Variable (Heap) Text-Segment Daten-Segment MMI-Befehle Lokale Variable, Stack Stack-Segment Pool-Segment Globale Variable (Heap) Daten-Segment Lokale Variable, Stack Stack-Segment Betriebssystem-Segment Pool-Segment Stack-Segment Betriebssystem-Segment Betriebssystem-Segment 2 33-1 2 64-1