Übersicht. Quelle: Kapitel 3, 4 und 5 aus Anlauff, Böttcher, Ruckert: Das MMIX-Buch. Springer, 2002

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

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

Technische Informatik II Rechnerarchitektur

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

Technische Informatik II Rechnerarchitektur

Merke: Mit jedem zusätzlichen Bit verdoppelt sich die Anzahl der darstellbaren Zahlen bzw. Zustände

Einstieg in die Informatik mit Java

MMIX Crashkurs Teil 3 Unterprogramme und Parameterübergabe. Freiling/Wienzek/Mink Vorlesung Rechnerstrukturen RWTH Aachen Sommersemester 2005

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

GI Vektoren

Wie werden die Barcode Prüfziffern berechnet?

Vorlesung IT-Systeme I

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

Kapitel 2: Darstellung von Information. Inhalt. Einfache Datentypen (Fortsetzung) Erste Programme (mit Ausgabe) Exkurs: Grammatiken

Programmieren in C Einführung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 11

Wie werden die Barcode Prüfziffern berechnet?

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Escape-Sequenzen. Dr. Norbert Spangler

Protokollgrundlagen (Schicht 2)

Rechnerstrukturen. Michael Engel und Peter Marwedel. Sommer TU Dortmund, Fakultät für Informatik

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

TI II. Sommersemester 2009 Prof. Dr. Mesut Güneş 7. Aufgabenblatt mit Lösungen

Programmiersprachen Einführung in C

Einführung in die Programmierung Wintersemester 2008/09

Übung Praktische Informatik II

MMIX - Crashkurs. TI-II Rechnerarchitektur

Lösungsvorschlag 9. Übung Technische Grundlagen der Informatik II Sommersemester 2009

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

MMIX: Einführung. Einführung. Ressourcen. Aussprache: em-micks Autor: Donald Knuth

@ A Q R ( ) Die Bedeutung der Steuerzeichen wird auf der Seite H2 (Tafel 2) erklärt. 6E 6F TAFELN, TABELLEN TAFEL 1. Schriftzeichen.

LOC Data_Segment

Rechnerstrukturen. 7. Assembler. Inhalt. Vorlesung Rechnerstrukturen. Assemblerprogrammierung SML-CPU. SML-Assembler. Binden

IM P label = Bedingte Verzweigungen

Eine Reihe häufig benötigter Datentypen ist in C vordefiniert

8. Arbeiten mit Dateien

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Zahlen und Zeichen (1)

Datenpfad einer einfachen MIPS CPU

Kapitel 2: Darstellung von Information Inhalt Einführung in die Informatik für Naturwissenschaftler und Ingenieure

Variablen und Datentypen

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

Datenpfad einer einfachen MIPS CPU

Zusammenfassung: Grundlagen der Informatik Zahlensysteme, b-adische Darstellung, Umrechnung Beispiel: Umrechnung von ( ) 10 ins Dualsystem

Clevere Algorithmen programmieren

4. TÜ-Zusammenfassung zum Modul Computersysteme

Vorlesung Rechnerarchitektur

Algorithmen und Datenstrukturen (für ET/IT)

Assembler DOS (Beta 1) Copyright 2000 Thomas Peschko. Assembler II - DOS. ASSEMBLER Arbeiten mit Dateien und Daten.

Rechnerstrukturen WS 2012/13

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

Datentypen printf und scanf. Programmieren in C Dr. Michael Zwick

Namensräume - der PREFIX-Befehl

Sprungbefehle und Kontroll-Strukturen

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Datentypen und Operatoren Ganzzahlige Numerische Datentypen Logischer Datentyp

Heute nur MIPS-Praxis (4 Aufgaben)

2 Darstellung von Zahlen und Zeichen

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

Organisatorisches. Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Was sind primitive Datentypen? Primitive Datentypen

Arithmetik, Register und Speicherzugriff. Grundlagen der Rechnerarchitektur Assembler 9

10. Die Adressierungsarten des MSP 430

Zusammenfassung der Assemblerbefehle des 8051

Algorithmen und ihre Programmierung

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.

LOC Data_Segment A OCTA a) Bestimmen Sie das 32 Bit breite Befehlswort des Befehls JMP Start.

######################### Zeichenkette auswerten ###################################

Assembler als Übersetzer

Programmiersprachen Einführung in C

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

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

11. Unterprogrammtechnik

1. Grundlegende Konzepte der Informatik

Übung zur Wirtschaftsinformatik I. Zahlensysteme / Codierung

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

Motivation und Überblick

Kapitel 1. Programmierkurs. 1.2 Allgemeiner Aufbau des Computers. 1.1 Hallo, Computer...?

2.1 Fundamentale Typen

Daniel Betz Wintersemester 2011/12

Rechnernetze und Organisation

Datenpfad einer einfachen MIPS CPU

Modul Einführung in die Informationstechnologie. Klausur

Algorithmen und Datenstrukturen (für ET/IT)

Thema 1 -- Fortsetzung. Computersystem, Informationsdarstellung

X = {x 1,x 2,...} sei ein Symbolalphabet eines Kodes. In diesem Kode sind card(x) = X Sachverhalte darstellbar

... Adressierung und Befehlsfolgen (1) Speicherbelegung. Hauptspeicheradressen. Inhalt von Speicherbelegungen: Operanden - Zahlen - Zeichen Befehle

Variablen und Datentypen

Technische Informatik 2 Adressierungsarten

9. Die Adressierungsarten des MSP 430

Algorithmen und Datenstrukturen (für ET/IT)

Computersysteme. Stacks Anwendung in der Assembler-Programmierung

Rechnerstrukturen Wintersemester 2002/03. Maschinensprache Opcode, Operanden, Adressierung Für Menschen schwer verdauliche Folgen von 0 und 1

Arrays (Felder/Vektoren)

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

TECHNISCHE HOCHSCHULE NÜRNBERG GEORG SIMON OHM. Die MARS Umgebung

A ProgrAmmer s Guide to KIM Programming

Organisatorisches. Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Definition Datenstruktur. Nächste Woche keine Vorlesung!

Organisatorisches. Folien (u.a.) auf der Lva-Homepage Skriptum über MU Online

Transkript:

Übersicht Wiederholung: ein einfaches MMIX-Programm Speicherorganisation, Speicherzugriff Zahlen und Arithmetik Zeichenketten und Ein-/Ausgabe Kontrollstrukturen Unterprogramme Quelle: Kapitel 3, 4 und 5 aus Anlauff, Böttcher, Ruckert: Das MMIX-Buch. Springer, 2002 MMIX - Crashkurs Seite 1

Ein einfaches MMIX-Programm Programm arithmetik.mms LOC #100 Main SET $1,4 Anfangswerte setzen SET $2,2 SET $3,40 MUL $4,$2,$3 Produkt von $2 und $3 nach $4 ADD $5,$4,$1 Summe von $4 und $1 nach $5 SUB $6,$1,$2 Differenz von $1 und $2 nach $6 DIV $7,$5,$6 Quotient von $5 und $6 nach $7 TRAP 0,Halt,0 MMIX - Crashkurs Seite 2

MMIX Assembler Listing Der MMIX-Assembler kann ein Assmbler Listing ausgeben: mmixal l arithmetik.txt arithmetik.mms erzeugt die Datei arithmetik.txt: LOC #100...100: e3010004 Main SET $1,4 Anfangswerte setzen...104: e3020002 SET $2,2...108: e3030028 SET $3,40...10c: 18040203 MUL $4,$2,$3 Produkt von $2 und $3 nach $4...110: 20050401 ADD $5,$4,$1 Summe von $4 und $1 nach $5...114: 24060102 SUB $6,$1,$2 Differenz von $1 und $2 nach $6...118: 1c070506 DIV $7,$5,$6 Quotient von $5 und $6 nach $7...11c: 00000000 TRAP 0,Halt,0 Symbol table: Main = #0000000000000100 (1) MMIX - Crashkurs Seite 3

MMIX Ablauf Durch die Angabe von tn kann man den MMIX-Simulator im Trace-Modus verwenden. Angabe von n bedeutet: jede n-te Verwendung eines Befehls wird ausgegeben. Beispiel: mmix t1 arithmetik.mmo 1. 0000000000000100: e3010004 (SETL) $1=l[1] = #4 1. 0000000000000104: e3020002 (SETL) rl=3, $2=l[2] = #2 1. 0000000000000108: e3030028 (SETL) rl=4, $3=l[3] = #28 1. 000000000000010c: 18040203 (MUL) rl=5, $4=l[4] = 2 * 40 = 80 1. 0000000000000110: 20050401 (ADD) rl=6, $5=l[5] = 80 + 4 = 84 1. 0000000000000114: 24060102 (SUB) rl=7, $6=l[6] = 4-2 = 2 1. 0000000000000118: 1c070506 (DIV) rl=8, $7=l[7] = 84 / 2 = 42, rr=0 1. 000000000000011c: 00000000 (TRAP) Halt(0) 8 instructions, 0 mems, 80 oops; 0 good guesses, 0 bad (halted at location #000000000000011c) MMIX - Crashkurs Seite 4

Speicherorganisation Im Programm auf der vorherigen Folie wird der Speicher nur dazu genutzt, um das Programm abzulegen. Der MMIX-Simulator holt sich die Objektdatei in den Speicher und führt sie beginnend beim ersten Befehl aus (muss durch Main markiert sein) Daten wurden mittels SET direkt in Register geschrieben Alternative: Verwendung von Direktoperanden, z.b. MUL $4,$2,40 Direktoperanden sind durch das Format des Befehlswortes eingeschränkt. Besser: Programme und Daten logisch trennen! Trennung von Daten und Programmcode Programme werden leichter wartbar Zugriff auf Daten über ihre (symbolischen) Adressen Speicherorganisation wird über Pseudobefehle durch den Assembler gemacht MMIX unterscheidet verschiedenen Bereiche im Hauptspeicher, die Segmente genannt werden MMIX - Crashkurs Seite 5

Speichersegmente Textsegment von #0 bis #1FFF FFFF FFFF FFFF (#0 bis #FF reserviert! Textsegment sollte als READ-ONLY angenommen werden!) Datensegment von #2000 0000 0000 0000 bis #3FFF FFFF FFFF FFFF Stacksegment von #6000 0000 0000 0000 bis #7FFF FFFF FFFF FFFF Für uns zunächst uninteressant: Poolsegment (zwischen Datensegment und Stacksegment) sowie Bereich für das Betriebssystem (hinter dem Stacksegment) MMIX - Crashkurs Seite 6

Belegen von Speicher Beispielprogrammfragment mit Pseudobefehlen zur Speicherorganisation: LOC #100 Start bei Adresse #100 X1 OCTA 4 Schreibt den Wert 4 an Adresse #100 X2 OCTA 2 Danach Wert 2 an Adresse #108 X3 OCTA 40 Schliesslich Wert 40 an Adresse #116 Zahlenwerte werden immer entsprechend ihrem Typ ausgerichtet Beispiel: OCTA wird immer ab der nächsten durch 8 teilbaren Adresse geschrieben Holen in Register durch LDO (Load Octa) zur Trennung von Daten und Programm Sauberere Trennung: Ablegen aller Daten im Datensegment durch LOC Data_Segment anschliessen Programm ab LOC #100 ablegen MMIX - Crashkurs Seite 7

Programm mit Trennung Daten/Text (arith-ldo.mms) LOC Data_Segment GREG @??? X1 OCTA 4 Daten im Datensegment ablegen X2 OCTA 2 X3 OCTA 40 LOC #100 Main LDO $1,X1 Anfangswerte aus dem Speicher lesen LDO $2,X2 LDO $3,X3 MUL $4,$2,$3 Produkt von $2 und $3 nach $4 ADD $5,$4,$1 Summe von $4 und $1 nach $5 SUB $6,$1,$2 Differenz von $1 und $2 nach $6 DIV $7,$5,$6 Quotient von $5 und $6 nach $7 TRAP 0,Halt,0 MMIX - Crashkurs Seite 8

LDO und LDOI Ausschnitte aus dem Trace von arith-ldo.mms: 1. 0000000000000100: 8d01fe00 (LDOI) $1=l[1] = M8[#2000000000000000] = 4 1. 0000000000000104: 8d02fe08 (LDOI) rl=3, $2=l[2] = M8[#200000000000000+8] = 2 1. 0000000000000108: 8d03fe10 (LDOI) rl=4, $3=l[3] = M8[#200000000000000+16] = 40 1. 000000000000010c: 18040203 (MUL) rl=5, $4=l[4] = 2 * 40 = 80 LDO wird übersetzt in ein LDOI (Load Octa Immediate) Es gibt nur das Befehlsformat LDO $X,$Y,$Z bzw LDO $X,$Y,Z Wie soll eine 64-Bit Adresse dort hineincodiert werden? Lösung: Assembler übersetzt den Ladebefehl LDO $1,X1 in LDO $1,$B,Z für ein verstecktes Basisregister $B und einen Offset Z relativ zu $B Basisregister wird durch GREG @ angelegt MMIX - Crashkurs Seite 9

Woher kommt das Basisregister? Ohne das GREG @ hätte man folgende Fehlermeldung: C:\...\RS>mmix arith-ldo.mms "arith-ldo.mms", line 6: no base address is close enough to the address A! "arith-ldo.mms", line 7: no base address is close enough to the address A! "arith-ldo.mms", line 8: no base address is close enough to the address A! (3 errors were found.) GREG @ legt implizit ein neues Basisregister für alle Daten ab der aktuellen Adresse (@) Im Programm arith-ldo.mms hat @ den Wert von Data_Segment Assemblierter Befehl LDO $2,X2 lautet: 8d02fe08 8d = Opcode für LDOI 02 = Zielregister $2 FE = Bezug auf neues Basisregister (hier $254) 08 = Offset von X2 zur Adresse aus dem Basisregister $254 Mehr zu globalen Registern später MMIX - Crashkurs Seite 10

Vorzeichenbehandlung beim Laden Befehle wie LDO, LDW fassen Daten immer als vorzeichenbehaftete Zahlen auf Bei den Ladebefehlen wird eine geladene Einheit immer als vorzeichenbehaftete Zahl im Zweierkomplement betrachtet Verbleibende freie Bits werden gemäß Vorzeichen aufgefüllt Automatische Ausrichtung der geladenen Adresse auf den Datentyp Beispiel: Sei die folgende Speicherbelegung gegeben M[100] M[101] M[102] M[103] M[104] M[105] M[106] M[107] 01 23 45 67 89 AB CD EF Sei $2=#100 und $3=2 Befehl: Wirkung auf Register $1: LDB $1,$2,$3 LDW $1,$2,$3 LDT $1,$2,$3 LDO $1,$2,$3 MMIX - Crashkurs Seite 11

Vorzeichenbehandlung beim Laden Sei wieder die folgende Speicherbelegung gegeben M[100] M[101] M[102] M[103] M[104] M[105] M[106] M[107] 01 23 45 67 89 AB CD EF Sei nun $2=#100 und $3=5, es wird also Adresse #105 angesprochen: Befehl: Wirkung auf Register $1: LDB $1,$2,$3 LDW $1,$2,$3 LDT $1,$2,$3 LDO $1,$2,$3 Vorzeichen wird beachtet. Falls dies nicht gewünscht wird: unsigned - Varianten (z.b. LDOU) benutzen. MMIX - Crashkurs Seite 12

Vorzeichenbehandlung bei Speichern Beim Speichern kann ein Überlauf eintreten: Falls die Zahl, die abgespeichert werden soll, zu groß ist für das Datenformat, in dem gespeichert wird z.b. STB kann nur Zahlen im Bereich -128 bis +127 ohne Überlauf abspeichern Beispiel: M[100] 01 M[101] 23 M[102] 45 M[103] 67 M[104] Sei $1 = -65536 = #FFFF FFFF FFFF 0000 $2 = #100 $3 = 2 Befehl Wirkung auf Speicherstelle M 8 [100], Überlauf? STB $1,$2,$3 STW $1,$2,$2 STT $1,$2,$3 STO $1,$2,$3 89 M[105] AB M[106] CD M[107] EF Ein Überlauf kann auch bei positiven Zahlen auftreten! Auch zum Speichern gibt es unsigned -Varianten. MMIX - Crashkurs Seite 13

Arithmetik Ganzzahlarithmetik wird beim MMIX mit 64-Bit-Zahlen im Zweierkomplement durchgeführt Addition (ADD): Überlauf, denn die Zahl ausserhalb des darstellbaren Zahlenbereichs liegt, also N < -2 63 oder N +2 63 Überlauf angezeigt durch Bit 6 im Spezialregister ra Subtraktion (SUB): Überlauf möglich, analog zur Addition Multiplikation (MUL): Im Zielregister werden die 64 niederwertigsten Bit des Ergebnisses abgespeichert Überlauf wie bei Addition/Subtraktion angezeigt Division (DIV): Ganzzahliger Anteil des Ergebnisses steht im Zielregister Rest der Division steht im Spezialregister rr Divisionsrest kann mit GET $X,rR in ein allgemeines Register geholt werden Vorsicht bei Division durch Null Es gibt auch unsigned -Varianten (ganze Zahlen zwischen 0 und 2 64-1. MMIX - Crashkurs Seite 14

Zeichenketten Definition Zeichenkette: Folge von Zeichen, die durch ein Nullzeichen abgeschlossen ist (ASCII-Code 0) Das Nullzeichen ist kein druckbares Zeichen, markiert nur das Ende der Zeichenkette (Konvention wie in C/C++) Zeichen werden im ASCII-Code im Speicher angelegt Festgelegte Zuordnung von darstellbaren Zeichen zu Zahlenwerten Ein Zeichen = Ein Byte Beispiel: OCTA #5465 7874 0000 0000 Alternative Formen: BYTE T, e, x, t,0 BYTE Text,0 Im Speicher: Nichtdruckbare Zeichen müssen mit ihrem ASCII-Codewert angegeben werden Beispiel: BYTE Text,#A,0 MMIX - Crashkurs Seite 15

MMIX - Crashkurs Seite 16 ASCII-Codes 0-63 S1 0F 15 SO 0E 14 CR 0D 13 FF 0C 12 VT 0B 11 LF 0A 10 HT 09 9 BS 08 8 BEL 07 7 ACK 06 6 ENQ 05 5 EOT 04 4 ETX 03 3 STX 02 2 SCH 01 1 NUL 00 0 US 1F 31 RS 1E 30 GS 1D 29 FS 1C 28 ESC 1B 27 SUB 1A 26 EM 19 25 CAN 18 24 ETB 17 23 SYN 16 22 NAK 15 21 DC4 14 20 DC3 13 19 DC2 12 18 DC1 11 17 DLE 10 16 / 2F 47. 2E 46-2D 45, 2C 44 + 2B 43 * 2A 42 ) 29 41 ( 28 40 ` 27 39 & 26 38 % 25 37 $ 44 36 23 35 ~ 22 34! 21 33 SP 20 32? 3F 63 > 3E 62 = 3D 61 < 3C 60 ; 3B 59 : 3A 58 9 39 57 8 38 56 7 37 55 6 36 54 5 35 53 4 34 52 3 33 51 2 32 50 1 31 49 0 30 48

MMIX - Crashkurs Seite 17 ASCII-Codes 64-127 O 4F 79 N 4E 78 M 4D 77 L 4C 76 K 4B 75 J 4A 74 I 49 73 H 48 72 G 47 71 F 46 70 E 45 69 D 44 68 C 43 67 B 42 66 A 41 65 @ 40 64 _ 5F 95 ^ 5E 94 ] 5D 93 \ 5C 92 [ 5B 91 Z 5A 90 Y 59 89 X 58 88 W 57 87 V 56 86 U 55 85 T 54 84 S 53 83 R 52 82 Q 51 81 P 50 80 o 6F 111 n 6E 110 m 6D 109 l 6C 108 k 6B 107 j 6A 106 i 69 105 h 68 104 g 67 103 f 66 102 e 65 101 d 64 100 c 63 99 b 62 98 a 61 97 60 96 DEL 7F 127 ~ 7E 126 } 7D 125 7C 124 { 7B 123 z 7A 122 y 79 121 x 78 120 w 77 119 v 76 118 u 75 117 t 74 116 s 73 115 r 72 114 q 71 113 p 70 112

Ein-/Ausgabe Einlesen von Daten von der Tastatur und Ausgabe auf dem Bildschirm sind komplexe, Geräteabhängige Vorgänge Werden durch Gerätetreiber implementiert, die die Daten aus bestimmten Speicherbereichen lesen oder dorthin schreiben In höheren Programmiersprachen sind diese Funktionen in Bibliotheken gekapselt, die entsprechende Betriebssystemfunktionen aufrufen Im MMIX-Simulator ist zwar kein Betriebssystem implementiert, es werden aber ein paar nützliche Basisfunktionen simuliert Realisierte Basisfunktionen: Programmhalt: Halt Einlesen einer Zeichenkette: Fgets ( get string from file ) Ausgabe einer zeichenkette: Fputs ( put string to file ) MMIX hält diese Funktionen unter bestimmten Nummern bereit Nummern werden über Sprungtabellen im Betriebssystem in Adressen umgewandelt Nach Ausführung der Funktion: Rückkehr ins aktuelle Assemblerprogramm als ob nichts gewesen wäre (Unterprogrammtechnik, siehe später) MMIX - Crashkurs Seite 18

TRAP Aufruf der Basisfunktionen des Betriebssystems durch TRAP: erstes Argument ist immer 0 zweites Argument: Nummer der aufzurufenden Funktion (oder ihr Name) drittes Argument Z und globales Register $255 kann zur Übergabe von Parametern verwendet werden Beispiel: TRAP 0, Halt,0 Ausgabe von Zeichenketten mittels TRAP: als drittes Argument muss die Nummer des Ausgabekanals übergeben werden Standard-Ausgabe StdOut ist der Bildschirm Dateien können mit weiteren Kanälen verbunden werden Implizite Annahme: Im Register $255 steht die Anfangsadresse einer Zeichenkette MMIX - Crashkurs Seite 19

Beispiel für einfache Ausgabe LOC Data_Segment GREG @ String BYTE "Text",#A,0 auszugebende Zeichenkette LOC #100 Main LDA $255,String Adresse des Strings in $255 TRAP 0,Fputs,StdOut Ausgabe der Zeichenkette TRAP 0,Halt,0 Bemerkungen: LDA benötigt GREG @ Es wird alles bis zur ersten Null ausgegeben. Vorsicht bei nicht-terminierten Zeichenketten! MMIX - Crashkurs Seite 20

Einlesen von Zeichenketten Ähnlich wie bei der Ausgabe wird ein Eingabekanal gefordert: Normalerweise StdIn (Standardeingabe) = Tastatur Man muss zusätzlich im Programm Speicherplatz (einen Puffer) reservieren für die eingelesenen Zeichen Beispiel: Puffer für 80 Zeichen im Speicher Buffer BYTE 0 Pufferanfang LOC Buffer+80 80 Byte bleiben unbelegt Zahl 0 ist eigentlich unnütz (wird ja als erstes überschrieben), wird aber benötigt, um eine Marke zu vergeben. Es muss zusätzlich neben der Adresse es Eingabepuffers seine Größe an Fgets übergeben werden Wir haben aber nur ein anderes Register $255?! Lösung: Wir schreiben die Parameter als Octabytes hintereinander in den Speicher und setzen $255 auf die Adresse des ersten dieser beiden Werte MMIX - Crashkurs Seite 21

Beispielprogramm für die Eingabe LOC Data_Segment GREG @ BufSize IS 80 Buffer BYTE 0 Puffer anlegen LOC Buffer+BufSize Arg OCTA Buffer Anfangsadresse OCTA BufSize Größe des Puffers LOC #100 Main LDA $255,Arg $255 <- #2000 0000 0000 0050 TRAP 0,Fgets,StdIn Einlesen TRAP 0,Halt,0 MMIX - Crashkurs Seite 22

Unbedingte Sprünge Es gibt im MMIX zwei Befehle für bedingungslose Sprünge: Befehl 1: JMP Marke JMP benutzt eine relative Adresse, eignet sich also gut für Sprünge in Schleifen Sowohl Sprung vorwärts als auch rückwärts erlaubt Maximale Sprunggröße durch Länge des Argumentes begrenzt (24 Bit) Über @ kann man auch ohne Marken arbeiten @ steht für die momentane Adresse des Programms Beispiel: JMP @+2*4 Springe zum übernächsten Befehl Befehl 2: GO Zieladresse wird in derselben Weise definiert wie bei Befehlen zum Laden und Speichern (mit Basisregister und Offset): absolute Adressierung, eignet sich also für weite Sprünge GO merkt sich im als erstes angegebenen Register die Adresse des Befehls, der als nächstes zur Ausführung gekommen wäre (diese Eigenschaft wird später noch interessant werden) Beispiel: GREG @ Start.. Sprungziel.. GO $0,Start MMIX - Crashkurs Seite 23

Bedingte Sprünge Sprünge können von einer zu testenden Bedingung abhängig gemacht werden Beispiel: BZ $1,Fertig Prüfe Register $1.. Fertig.. hier fortfahren falls Null Wie beim JMP-Befehl wird die Marke hier vom Assembler eine relative Adressierung umgesetzt Stehen aber nur 16 Bit als Sprungweite zur Verfügung Effizienz: Ein nicht gemachter Sprung ist schneller als ein gemachter Sprung (in Taktzyklen) Man kann dem Assembler angeben, ob in der Regel ein Sprung gemacht wird: Probable Branch -Varianten PBZ etc. MMIX - Crashkurs Seite 24

Beispiel: Euklid scher Algorithmus r IS $1 Berechnet den ggt von m und n m IS $2 n IS $3 LOC #100 Main SET m,1228 Startwerte setzen SET n,96 Start DIV m,m,n m := m DIV n GET r,rr r := m MOD n (aus Spezialregister) BZ r,fertig SET m,n m := n SET n,r n := r JMP Start Fertig TRAP 0,Halt,0 Ergebnis steht in $3 Man kann das auch mit nur einem Sprungbefehl machen! MMIX - Crashkurs Seite 25