2 Assembler Programmierung - mzwebserver.ldv.ei.tum.de Assembler... · MMIX Architektur Programmier-Architektur 17 8, 16, 32, 64 Bit 64 Bit OP X Y Z 8, 16, 24 Bit 64 Bit 64 Bit Spezial-Register
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
MMIX Assembler Programmierung
Dr. Michael ZwickZahldarstellung
Festkommazahlen
■ Vorzeichenlose Zahlen – n Bit => 2n verschiedene Werte darstellbar – Wertebereich: 0 ... 2n - 1 – Kodierung:
– Vorzeichen & Betrag • Kodierung: Bit n-1 ist Vorzeichen, Bits n-2, ... , 0 ist Betrag der Zahl • Wertebereich: -2n-1 + 1, ... -0, +0, ... , 2n-1 -1
3
Festkommazahlen
■ Zahlenring für 4 Bit:
Stand: 02.07.2003 68
2 COMPUTER-ARITHMETIK 2.1 Arithmetik mit ganzen Zahlen • Zahlenring für Wortbreite n = 4 Bit − Vorzeichenlose Zahlen − Vorzeichenbehaftete Zahlen im 2er-Komplement
■ American Standards Code for Information Interchange (ASCII)
■ Bytecode 0...127
■ Unterschiedliche Nullen – 0: Zahl Null; als 0x00 codiert – ‘\0’: Ende einer Zeichenkette; als 0x00 codiert – ‘0’: Zeichen Null; als 48 = 0x30 codiert
8
02.11.11 09:45American Standard Code for Information Interchange – Wikipedia
Page 3 of 11http://de.wikipedia.org/wiki/Ascii
boten auch Acht-Bit-Codes, in denen ein Byte für ein Zeichen stand, zu wenig Platz, um alleZeichen der menschlichen Schriftkultur gleichzeitig unterzubringen. Dadurch wurden mehrereverschiedene spezialisierte Erweiterungen notwendig. Daneben existieren vor allem für denostasiatischen Raum einige ASCII-kompatible Kodierungen, die entweder zwischen verschiedenenCodetabellen umschalten oder mehr als ein Byte für jedes Nicht-ASCII-Zeichen benötigen.[1]
Keine dieser Acht-Bit-Erweiterungen ist aber „ASCII“, denn das bezeichnet nur den einheitlichenSieben-Bit-Code.
Für die Kodierung lateinischer Zeichen wird fast nur noch im Großrechnerbereich eine zu ASCIIinkompatible Kodierung verwendet (EBCDIC).
Code …0 …1 …2 …3 …4 …5 …6 …7 …8 …9 …A …B …C …D …E …F0… NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI1… DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US2… SP ! " # $ % & ' ( ) * + , - . /3… 0 1 2 3 4 5 6 7 8 9 : ; < = > ?4… @ A B C D E F G H I J K L M N O5… P Q R S T U V W X Y Z [ \ ] ^ _6… ` a b c d e f g h i j k l m n o7… p q r s t u v w x y z { | } ~ DEL
Die ersten 32 ASCII-Zeichencodes (von 00 bis 1F) sind für Steuerzeichen (control character)reserviert; siehe dort für die Erklärung der Abkürzungen in obiger Tabelle. Das sind Zeichen, diekeine Schriftzeichen darstellen, sondern die zur Steuerung von solchen Geräten dienen (oderdienten), die den ASCII verwenden (etwa Drucker). Steuerzeichen sind beispielsweise derWagenrücklauf für den Zeilenumbruch oder Bell (die Glocke); ihre Definition ist historischbegründet.
Code 20 (SP) ist das Leerzeichen (engl. space oder blank), das in einem Text als Leer- undTrennzeichen zwischen Wörtern verwendet und auf der Tastatur durch die Leertaste erzeugt wird.
Die Codes 21 bis 7E stehen für druckbare Zeichen, die Buchstaben, Ziffern und Satzzeichenumfassen.
Code 7F (alle sieben Bits auf eins gesetzt) ist ein Sonderzeichen, das auch als Löschzeichenbezeichnet wird (DEL). Dieser Code wurde früher wie ein Steuerzeichen verwendet, um aufLochstreifen oder Lochkarten ein bereits gelochtes Zeichen nachträglich durch das Setzen allerBits, das heißt durch Auslochen aller sieben Markierungen, löschen zu können – einmalvorhandene Löcher kann man schließlich nicht mehr rückgängig machen. Bereiche ohne Löcher
Zeichen
■ Druckbare Zeichen – a..z, A..Z, !, *, etc. – Beginnen in der ASCII-Tabelle bei 32 !
■ Steuerzeichen – nicht druckbare Zeichen – Einträge 0, ... , 31 der ASCII-Tabelle – Dienten zur Steuerung von Druckern, Fernschreibern etc.
Codepage 850aus Wikipedia, der freien Enzyklopädie
Codepage 850 ist eine von MS-DOS und PC DOS verwendete Codepage (daher auch bekannt alsDOS-Latin-1). Sie wurde 1987 mit DOS 3.3 eingeführt.
Sie modifiziert die Codepage 437 dahingehend, dass die griechischen Buchstaben (mit Ausnahmedes β, welches auch für das deutsche ß benutzt wurde und das µ, das als Vorsilbe für 10-6 dient)und die gemischten Rahmenzeichen (die aus einfachen und doppelten Rahmenabschnittenbestehen) entfernt wurden und durch die in CP 437 fehlenden Zeichen aus dem ISO-8859-1-Zeichensatz ersetzt wurden.
Dies führte bei einigen DOS-Programmen (z. B. Norton Commander 3.0) zu Darstellungsfehlern,da diese statt Rahmenzeichen nun Buchstaben zeigten. Einige Programme erkannten jedoch dieCodepage und passten ihre Darstellung entsprechend an.
Aufgrund der Kompatibilität zur CP 437 liegen die neu hinzugekommenen Zeichen etwaschaotisch verstreut in der Codepage.
1* ▶ ◄ � ‼ ¶ § " � ↑ ↓ → ← ∟ ↔ ▲ ▼2* ! " # $ % & ' ( ) * + , - . /3* 0 1 2 3 4 5 6 7 8 9 : ; < = > ?4* @ A B C D E F G H I J K L M N O5* P Q R S T U V W X Y Z [ \ ] ^ _6* ` a b c d e f g h i j k l m n o7* p q r s t u v w x y z { | } ~ �
8* Ç ü é â ä à å ç ê ë è ï î ì Ä Å9* É æ Æ ô ö ò û ù ÿ Ö Ü ø £ Ø × ƒA* á í ó ú ñ Ñ ª º ¿ ® ¬ ½ ¼ ¡ « »
■ MMIX = Prozessor Modell – Entwickelt für Forschung & Lehre – Kein real existierender Prozessor
• keine “Legacy-Effekte” !
– Sehr regulärer Befehlssatz (RISC) • einfach erlernbar • einfach in Hardware implementierbar => einfacher Datenpfad !
– Nur wenige Spezialregister • einfach zu merken aufgrund der geringen Anzahl !
– Viele Allzweckregister • trotz hoher Anzahl einfach zu merken, da alle Register gleich verwendet werden • können mit nahezu jedem Befehl kombiniert werden !
– Zur Steuerung des Prozessors • Welche Interrupts sollen auftreten können? • Wie sollen virtuelle Adressen in reale Adressen gewandelt werden? • Zwischenspeichern von Operanden falls Interrupts auftreten • Welcher Rundungsmodus bei Gleitkommazahlen? !
– Auslesen von (Status-) Informationen • Wieviele Befehle wurden ausgeführt? • Rest einer Division • Zeit/Takte !
Gleitkommazahl ungenau (z.B. 1.0 / 3.0)Gleitkomma-Division durch 0Gleitkomma-UnterlaufGleitkomma-ÜberlaufUnerlaubte Gleitkomma- Operation, z.B. sqrt(-1.0)Überlauf bei Wandlung Gleit- komma- in FestkommazahlFestkomma-ÜberlaufFestkomma-Division durch 0
■ Pool Segment – Kommunikation zwischen Betriebssystem und Benutzerprogramm – Übergabe von Ausführungs-Parametern an das Benutzerprogramm – Auslesen des Ergebnisses der Programmausführung !
– Programm-Start • In Register 0 wird die Anzahl der Argumente abgespeichert (argc) • In Register 1 wird ein Zeiger auf ein Zeigerliste im Pool-Segment
gespeichert (argv) – Liste enthält Zeiger auf Zeichenketten/Strings
– Erster Parameter ist immer der Name des Programms, – dann kommen die Parameter
– Liste endet mit 0 !
– Beispiel: • mmix skalprodarg 4 1 2 3 4 10 20 30 40 • In Register 0 wird 10 abgespeichert, da es 10 Argumente sind • In Register 1 wird 0x4000000000000008 als Startadresse abgespeichert
■ Byte-Reihenfolge beim Abspeichern von Datenworten !
– Big Endian • Adressierung des höherwertigsten Bytes • MMIX, MIPS, SPARC, Atmel AVR32, ... • 0x0123456789ABCDEF !
– Little Endian • Adressierung des niederwertigsten Bytes • Intel x86, Renesas SH, ... • 0xEFCDAB8967452301
Aufgaben S. 27-32
MMIX Programme
MMIX Programme
■ Format von MMIX-Programmen
41
// Zeilen, die mit einem Sonderzeichen * beginnen, sind ein Kommentar
LOC Data_Segment GREG @ SP GREG Pool_Segment A OCTA 123456 init memory !a IS $1 name $1 as a ! LOC #100 Main LDO a,A other comment !Start SUB SP,SP,8 push to stack
STO a,:SP,0 ... ...
Marke Befehl Operanden Kommentar
Assembler- und Loader-Befehle
Assembler- und Loader-Befehle
■ Assembler-Befehle – werden vom Assembler ausgeführt
• Der Assembler ist das Programm, das MMIX-Quellcode in auf MMIX-Prozessoren ausführbaren MMIX-Maschinencode übersetzt
• Ein MMIX-Assembler-Programm ist auf der LDV-Webseite herunterladbar – beeinflussen die Maschinencode-Generierung des Assemblers !
■ Der IS-Befehl – führt eine reine Text-Ersetzung durch wie die Präprozessor-Anweisung
#define in der Programmiersprache C – ermöglicht es, Registernamen $1, $2, ... durch beliebige Namen zu ersetzen
ADD x,y,z
0x20010203
ADD $1,$2,$3
0x20010203
Assembler
Assembler Befehle:
x IS $1 y IS $2 z IS $3
Assembler
43
Assembler- und Loader-Befehle
■ Loader-Befehle – werden vom Loader ausgeführt
• der Loader ist das Betriebssystem-Programm, das Benutzerprogramme in den Speicher lädt und dann ausführt
!– werden vom Assembler aus dem MMIX-Quelltext generiert; Beispiel:
!• Der MMIX-Quelltext enthält Anweisungen, welche Variable an welchen
Speicheradressen abgelegt werden sollen !
• Der Assembler erzeugt dann bei der Übersetzung des Quelltexts Loader-Befehle, die vom Loader interpretiert werden können, und schreibt diese zusammen mit den MMIX-Maschinenbefehlen in die ausführbare Binärdatei !
• Wenn die Binärdatei ausgeführt werden soll, wird sie vom Loader in den Arbeitsspeicher geladen. !
• Anschließend werden die in der Binärdatei enthaltenen Loader-Befehle vom Loader interpretiert und ausgeführt. !
• Als Folge wird z.B. vom Betriebssystem Speicher für Variable angelegt und entsprechend der Loader-Befehle initialisiert.
44
Assembler- und Loader-Befehle
■ Der GREG-Befehl – GREG = Reserviere ein globales Register; Beispiele: !
– GREG @ • reserviert das nächste globale Register und weist diesem als Wert die aktuelle
Position zu (@ bedeutet: “the place where we are at the moment”) !
– SP GREG #4000000000000000 • reserviert das nächste globale Register und weist diesem den Wert
0x4000000000000000 zu • das reservierte globale Register kann mit dem Namen SP angesprochen werden
45
Assembler- und Loader-Befehle
■ Der LOC-Befehl – LOC = Locate; Locate an address – legt die Start-Adresse für alle nachfolgenden Aktionen fest – Beispiele:
!• LOC Data_segment = LOC #2000000000000000
– Beginne beim Beginn des Datensegments – Ab dieser Adresse werden die Variable abgelegt !
• LOC #100 – Beginne bei Adresse 0x100, d.h. direkt nach den Interruptvektoren – Ab dieser Adresse wird der Programmcode abgelegt
46
Assembler- und Loader-Befehle
■ Die Befehle BYTE, WYDE, TETRA und OCTA – reservieren 8 Bit (BYTE), 16 Bit (WYDE), 32 Bit (TETRA) oder 64 Bit (OCTA)
an der aktuellen Adresse !
– werden benutzt um Variable anzulegen !
– können auch mehrere Variable des gleichen Typs anlegen, falls diese durch Komma getrennt werden; mit Anführungszeichen unterstützt BYTE Strings !
– berücksichtigen automatisch das Alignment, d.h. • Bytes können an jeder Adresse abgelegt werden • Wydes werden an durch 2 teilbaren Adressen (letztes Adressbit = 0) abgelegt • Tetras werden an durch 4 teilbaren Adressen (letzten beiden Adr.-Bits = 0) abgelegt • Octas werden an durch 8 teilbaren Adressen (letzten drei Adr.-Bits = 0) abgelegt
47
Assembler- und Loader-Befehle
■ Die Befehle BYTE, WYDE, TETRA und OCTA – Beispiele: !– A OCTA 10
• Ist die aktuelle Adresse durch 8 teilbar, dann wird an dieser Adresse ein 64 Bit breites Datenwort reserviert !
• Ist die aktuelle Adresse nicht durch 8 teilbar, wird die nächste durch 8 teilbare Adresse verwendet !
• An die reservierte Adresse wird die 64 Bit breite Festkommazahl 10 gespeichert !
• Die Speicherung erfolgt Big-Endian !
• Auf die reservierte Adresse, und damit auch auf 10, kann über die Marke “A” zugegriffen werden
!– A OCTA
• wie oben, jedoch fehlt die Initialisierung, d.h. an der durch A ansprechbaren Adresse steht ein undefinierter Wert
48
Assembler- und Loader-Befehle
■ Beispiel
49
LOC #2000000000000000 LOC Data_Segment ! GREG @ !N WYDE ID OCTA 12345678 Name BYTE “Das ist ein String.”,0
// Zeilen, die mit einem Sonderzeichen * beginnen, sind ein Kommentar
LOC Data_Segment GREG @ SP GREG Pool_Segment A OCTA 123456 init memory !a IS $1 name $1 as a ! LOC #100 Main LDO a,A other comment !Start SUB SP,SP,8 push to stack
STO a,:SP,0 ... ...
Marke Befehl Operanden Kommentar
MMIX Befehlsformat
■ 32 Bit Befehlswort !
!
!
!
■ Allgemein !
!
!
!
■ Speicher-Befehle
54
Befehl Ziel Quelle 1 Quelle 2
Befehl Quelle Ziel Ziel
Opcode 1. Operand = X 2. Operand = Y 3. Operand = Z
0781516232431
MMIX Befehlsformat
■ 32 Bit Befehlswort
55
Label ADD $1,$2,$3 Kommentar
0x20 0x01 0x02 0x03
Opcode 1. Operand = X 2. Operand = Y 3. Operand = Z
M ist der Arbeitsspeicher des MMIX Prozessors (M = memory).
• M1[x ] ist das an Adresse x gespeicherte Byte.
• M2[x ] ist das an Adresse x &(�2) gespeicherte Wyde.
• M3[x ] ist das an Adresse x &(�4) gespeicherte Tetra.
• M4[x ] ist das an Adresse x &(�8) gespeicherte Octa.
Die Symbole ◆, X, Y, Z, $X, $Y, $Z, $0, $1, ..., M1[...], M2[...], ... repräsentieren Bitmuster.
Ein Zahlenwert entsteht erst durch entsprechende Interpretation des Bitmusters (z.B.
vorzeichenlose Festkommazahl, ...).
Befehlszähler
@
@
Definitionen
■ Operationen
71
2.3 MMIX Befehle 45
Operationen
• x y : Weise x den Wert y zu
• x , y : Ausdruck x ist äquivalent zum Ausdruck y
• x ) y : Wenn x , dann y
• x ||y : Logische operation x ODER y
• x = y : Vergleich ob x den gleichen Wert hat wie y ; liefert wahr (d.h. 1), wenn x
den selben Wert hat wie y , sonst falsch (d.h. 0)
• x ⌧ y : Schiebe x um y Stellen nach links; fülle frei werdende Bitstellen mit 0
auf
• x �u
y : Schiebe x um y Bitstellen nach rechts; fülle frei werdende Bitstellen
mit 0 auf
• x �s
y : Schiebe x um y Bitstellen nach rechts; fülle frei werdende Bitstellen mit
dem Wert des Vorzeichenbits (MSB) auf.
• x % y : Rest der Festkomma-Division x/y .
• ⇠ x : Invertiere alle Bits von x , d.h. berechne das 1er-Komplement
• x & y : Bitweise UND-Verknüpfung von x und y
• x | y : Bitweise ODER-Verknüpfung von x und y
• x ⌦ y : Bitweise XOR-Verknüpfung von x und y
Umwandlung Festkommazahl$ Gleitkommazahl
• f32(w4): Nimmt an, dass das vier Byte breite Datenwort w4 im 32 Bit IEEE 754
Gleitkommaformat codiert ist und gibt den entsprechenden Zahlenwert zurück
(z.B. 1,75).
• f
032(x): Codiert die Zahl x als 32 Bit breite Gleitkommazahl und gibt das
entsprechende 32 Bit breite Bitmuster zurück.
• f64(w8): Nimmt an, dass das acht Byte breite Datenwort w8 im 64 Bit IEEE 754
Gleitkommaformat codiert ist und gibt den entsprechenden Zahlenwert zurück
(z.B. 1,75).
• f
064(x): Codiert die Zahl x als 64 Bit breite Gleitkommazahl und gibt das
entsprechende 64 Bit breite Bitmuster zurück.
• r(x): Rundet eine reelle Zahl gemäß dem in Register rA ausgewählten Run-
dungsmodus auf eine ganze Zahl.
Definitionen
■ Umwandlung Festkommazahl <-> Gleitkommazahl
72
2.3 MMIX Befehle 45
Operationen
• x y : Weise x den Wert y zu
• x , y : Ausdruck x ist äquivalent zum Ausdruck y
• x ) y : Wenn x , dann y
• x ||y : Logische operation x ODER y
• x = y : Vergleich ob x den gleichen Wert hat wie y ; liefert wahr (d.h. 1), wenn x
den selben Wert hat wie y , sonst falsch (d.h. 0)
• x ⌧ y : Schiebe x um y Stellen nach links; fülle frei werdende Bitstellen mit 0
auf
• x �u
y : Schiebe x um y Bitstellen nach rechts; fülle frei werdende Bitstellen
mit 0 auf
• x �s
y : Schiebe x um y Bitstellen nach rechts; fülle frei werdende Bitstellen mit
dem Wert des Vorzeichenbits (MSB) auf.
• x % y : Rest der Festkomma-Division x/y .
• ⇠ x : Invertiere alle Bits von x , d.h. berechne das 1er-Komplement
• x & y : Bitweise UND-Verknüpfung von x und y
• x | y : Bitweise ODER-Verknüpfung von x und y
• x ⌦ y : Bitweise XOR-Verknüpfung von x und y
Umwandlung Festkommazahl$ Gleitkommazahl
• f32(w4): Nimmt an, dass das vier Byte breite Datenwort w4 im 32 Bit IEEE 754
Gleitkommaformat codiert ist und gibt den entsprechenden Zahlenwert zurück
(z.B. 1,75).
• f
032(x): Codiert die Zahl x als 32 Bit breite Gleitkommazahl und gibt das
entsprechende 32 Bit breite Bitmuster zurück.
• f64(w8): Nimmt an, dass das acht Byte breite Datenwort w8 im 64 Bit IEEE 754
Gleitkommaformat codiert ist und gibt den entsprechenden Zahlenwert zurück
(z.B. 1,75).
• f
064(x): Codiert die Zahl x als 64 Bit breite Gleitkommazahl und gibt das
entsprechende 64 Bit breite Bitmuster zurück.
• r(x): Rundet eine reelle Zahl gemäß dem in Register rA ausgewählten Run-
dungsmodus auf eine ganze Zahl.
Definitionen
■ (De-) Codierung von Festkommazahlen
73
46 2 Assemblerprogrammierung
(De-) Codierung von Festkommazahlen
• s(wb): Nimmt an, dass das b Byte breite Wort wb im 2er-Komplement codiert
ist und gibt den entsprechenden Wert zurück (z.B. 1, 0, -3)
• u(wb): Nimmt an, dass das b Byte breite Wort wb als vorzeichenlose Festkom-
mazahl codiert ist und gibt den entsprechenden Wert zurück (z.B. 0, 1)
• s
0b
(x): Gibt das b Bit breite im 2er-Komplement codiert Bitmuster zurück das
dem Wert x entspricht.
• u
0b
(x): Gibt das b Bit breite Bitmuster (vorzeichenlose Codierung) zurück das
dem Wert x , x � 0, entspricht.
Zusammenfassen von in Registern gespeicherten Werten
Wenn $X das 64 Bit breite in Register X gespeicherte Bitmuster ist und $Y das 64 Bit breitein Register Y gespeicherte Bitmuster ist, dann ist $X$Y das 128 Bit breite Bitmuster das
aus der Aneinanderreihung der beiden Bitmuster $X und $Y entsteht. ($X$Y)127...64 = $Xund ($X$Y)63...0 = $Y.
Programm beenden
• TRAP 0,Halt,0 beendet ein MMIX-Programm und gibt die Kontrolle zurück an
das Betriebssystem.
Definitionen
■ Zusammenfassen von Werten !
!
!
!
!
!
!
■ Programm beenden
74
46 2 Assemblerprogrammierung
(De-) Codierung von Festkommazahlen
• s(wb): Nimmt an, dass das b Byte breite Wort wb im 2er-Komplement codiert
ist und gibt den entsprechenden Wert zurück (z.B. 1, 0, -3)
• u(wb): Nimmt an, dass das b Byte breite Wort wb als vorzeichenlose Festkom-
mazahl codiert ist und gibt den entsprechenden Wert zurück (z.B. 0, 1)
• s
0b
(x): Gibt das b Bit breite im 2er-Komplement codiert Bitmuster zurück das
dem Wert x entspricht.
• u
0b
(x): Gibt das b Bit breite Bitmuster (vorzeichenlose Codierung) zurück das
dem Wert x , x � 0, entspricht.
Zusammenfassen von in Registern gespeicherten Werten
Wenn $X das 64 Bit breite in Register X gespeicherte Bitmuster ist und $Y das 64 Bit breitein Register Y gespeicherte Bitmuster ist, dann ist $X$Y das 128 Bit breite Bitmuster das
aus der Aneinanderreihung der beiden Bitmuster $X und $Y entsteht. ($X$Y)127...64 = $Xund ($X$Y)63...0 = $Y.
Programm beenden
• TRAP 0,Halt,0 beendet ein MMIX-Programm und gibt die Kontrolle zurück an
das Betriebssystem.
46 2 Assemblerprogrammierung
(De-) Codierung von Festkommazahlen
• s(wb): Nimmt an, dass das b Byte breite Wort wb im 2er-Komplement codiert
ist und gibt den entsprechenden Wert zurück (z.B. 1, 0, -3)
• u(wb): Nimmt an, dass das b Byte breite Wort wb als vorzeichenlose Festkom-
mazahl codiert ist und gibt den entsprechenden Wert zurück (z.B. 0, 1)
• s
0b
(x): Gibt das b Bit breite im 2er-Komplement codiert Bitmuster zurück das
dem Wert x entspricht.
• u
0b
(x): Gibt das b Bit breite Bitmuster (vorzeichenlose Codierung) zurück das
dem Wert x , x � 0, entspricht.
Zusammenfassen von in Registern gespeicherten Werten
Wenn $X das 64 Bit breite in Register X gespeicherte Bitmuster ist und $Y das 64 Bit breitein Register Y gespeicherte Bitmuster ist, dann ist $X$Y das 128 Bit breite Bitmuster das
aus der Aneinanderreihung der beiden Bitmuster $X und $Y entsteht. ($X$Y)127...64 = $Xund ($X$Y)63...0 = $Y.
Programm beenden
• TRAP 0,Halt,0 beendet ein MMIX-Programm und gibt die Kontrolle zurück an
das Betriebssystem.
Laden und Speichern
Laden und Speichern
■ Progammiermodell
76
8, 16, 32, 64 Bit
64 Bit
OP X Y Z
8, 16, 24 Bit
64 Bit
64 Bit
Spezial- Register
Allzweck- Register
Speicher
Rechen- werk (ALU)
32 Bit Befehlswort
Laden
Speichern
Laden und Speichern
■ Laden von Daten – Welche Größe? Byte, Wyde, Tetra, Octa? – Vorzeichenbehaftet? Vorzeichenlos?
77
MemoryRegister
byte
wyde
tetra
octa
063063
Laden und Speichern
■ Adressierung des Arbeitsspeichers – Befehlswort: 32 Bit – Opcode: 8 Bit – Laden: 8 Bit für Zielregister; Speichern: 8 Bit für Quellregister !
– Verbleiben 16 Bit um 64 Bit breite Adresse abzuspeichern
78
Opcode 1. Operand = X 2. Operand = Y 3. Operand = Z
0781516232431
Laden und Speichern
■ Speicheradressierung
79
8, 16, 32, 64 Bit
64 Bit
OP X Y Z
8, 16, 24 Bit
64 Bit
64 Bit
Spezial- Register
Allzweck- Register
Speicher
Rechen- werk (ALU)
32 Bit Befehlswort
Laden und Speichern
■ Speicheradressierung
80
8, 16, 32, 64 Bit
64 Bit
OP X Y Z
8, 16, 24 Bit
64 Bit
64 Bit
Spezial- Register
Allzweck- Register
Speicher
Rechen- werk (ALU)
32 Bit Befehlswort
Adresse
Speichern
Laden
Basis-Adress-Register
Quell-/Ziel-Register
Offset
Laden und Speichern
■ Speicheradressierung
81
2.1 MMIX Architecture 21
See the following instructions:
LOC Data_SegmentGREG @
A OCTA 1000
a IS $1b IS $2
LOC #100Main LDB a,A LDB see this lineStart SUB a,a,1
OR a,a,0PBNZ a,Start PBNZ see this lineTRAP 0,0,0
k) Determine the 32 bit instruction word of instruction ‘‘PBNZ a,Start’’.
0x5B010002.
l) Determine the 32 bit instruction word of instruction ‘‘LDB a,A’’.
M ist der Arbeitsspeicher des MMIX Prozessors (M = memory).
• M1[x ] ist das an Adresse x gespeicherte Byte.
• M2[x ] ist das an Adresse x &(�2) gespeicherte Wyde.
• M3[x ] ist das an Adresse x &(�4) gespeicherte Tetra.
• M4[x ] ist das an Adresse x &(�8) gespeicherte Octa.
Die Symbole ◆, X, Y, Z, $X, $Y, $Z, $0, $1, ..., M1[...], M2[...], ... repräsentieren Bitmuster.
Ein Zahlenwert entsteht erst durch entsprechende Interpretation des Bitmusters (z.B.
vorzeichenlose Festkommazahl, ...).
Befehlszähler
@
Aufgaben S. 78-79
Verzweigungen
Verzweigungen
■ Unbedingte Verzweigung
113
2.3 MMIX Befehle 81
Verzweigungsbefehle
Unbedingte Verzweigung
Befehl Operanden Name/Aktion Definition
JMP XYZ Jump @ u
064( u(@) + 4 · s(XYZ) )
Bedingte Verzweigungen
Befehl Operanden Name/Aktion Definition
BZ $X,YZ Branch if zero s($X) = 0) @ u
064( u(@) + 4 · s(YZ) )
PBZ $X,YZ Probable br. if zero s($X) = 0) @ u
064( u(@) + 4 · s(YZ) )
BNZ $X,YZ Branch if nonzero s($X) 6= 0) @ u
064( u(@) + 4 · s(YZ) )
PBNZ $X,YZ Prob. br. if nonzero s($X) 6= 0) @ u
064( u(@) + 4 · s(YZ) )
BN $X,YZ Branch if negative s($X) < 0) @ u
064( u(@) + 4 · s(YZ) )
PBN $X,YZ Prob. br. if negative s($X) < 0) @ u
064( u(@) + 4 · s(YZ) )
BNN $X,YZ Branch if nonneg. s($X) � 0) @ u
064( u(@) + 4 · s(YZ) )
PBNN $X,YZ Prob. br. if nonneg. s($X) � 0) @ u
064( u(@) + 4 · s(YZ) )
BP $X,YZ Branch if positive s($X) > 0) @ u
064( u(@) + 4 · s(YZ) )
PBP $X,YZ Prob. br. if positive s($X) > 0) @ u
064( u(@) + 4 · s(YZ) )
BNP $X,YZ Branch if nonpositive s($X) 0) @ u
064( u(@) + 4 · s(YZ) )
PBNP $X,YZ Prob. br. if nonpos. s($X) 0) @ u
064( u(@) + 4 · s(YZ) )
BEV $X,YZ Branch if even s($X)%2 = 0) @ u
064( u(@)+4·s(YZ) )
PBEV $X,YZ Prob. branch if even s($X)%2 = 0) @ u
064( u(@)+4·s(YZ) )
BOD $X,YZ Branch if odd s($X)%2 = 1) @ u
064( u(@)+4·s(YZ) )
PBOD $X,YZ Prob. branch if odd s($X)%2 = 1) @ u
064( u(@)+4·s(YZ) )
Verzweigungen
■ Bedingte Verzweigungen
2.3 MMIX Befehle 81
Verzweigungsbefehle
Unbedingte Verzweigung
Befehl Operanden Name/Aktion Definition
JMP XYZ Jump @ u
064( u(@) + 4 · s(XYZ) )
Bedingte Verzweigungen
Befehl Operanden Name/Aktion Definition
BZ $X,YZ Branch if zero s($X) = 0) @ u
064( u(@) + 4 · s(YZ) )
PBZ $X,YZ Probable br. if zero s($X) = 0) @ u
064( u(@) + 4 · s(YZ) )
BNZ $X,YZ Branch if nonzero s($X) 6= 0) @ u
064( u(@) + 4 · s(YZ) )
PBNZ $X,YZ Prob. br. if nonzero s($X) 6= 0) @ u
064( u(@) + 4 · s(YZ) )
BN $X,YZ Branch if negative s($X) < 0) @ u
064( u(@) + 4 · s(YZ) )
PBN $X,YZ Prob. br. if negative s($X) < 0) @ u
064( u(@) + 4 · s(YZ) )
BNN $X,YZ Branch if nonneg. s($X) � 0) @ u
064( u(@) + 4 · s(YZ) )
PBNN $X,YZ Prob. br. if nonneg. s($X) � 0) @ u
064( u(@) + 4 · s(YZ) )
BP $X,YZ Branch if positive s($X) > 0) @ u
064( u(@) + 4 · s(YZ) )
PBP $X,YZ Prob. br. if positive s($X) > 0) @ u
064( u(@) + 4 · s(YZ) )
BNP $X,YZ Branch if nonpositive s($X) 0) @ u
064( u(@) + 4 · s(YZ) )
PBNP $X,YZ Prob. br. if nonpos. s($X) 0) @ u
064( u(@) + 4 · s(YZ) )
BEV $X,YZ Branch if even s($X)%2 = 0) @ u
064( u(@)+4·s(YZ) )
PBEV $X,YZ Prob. branch if even s($X)%2 = 0) @ u
064( u(@)+4·s(YZ) )
BOD $X,YZ Branch if odd s($X)%2 = 1) @ u
064( u(@)+4·s(YZ) )
PBOD $X,YZ Prob. branch if odd s($X)%2 = 1) @ u
064( u(@)+4·s(YZ) )
2.3 MMIX Befehle 81
Verzweigungsbefehle
Unbedingte Verzweigung
Befehl Operanden Name/Aktion Definition
JMP XYZ Jump @ u
064( u(@) + 4 · s(XYZ) )
Bedingte Verzweigungen
Befehl Operanden Name/Aktion Definition
BZ $X,YZ Branch if zero s($X) = 0) @ u
064( u(@) + 4 · s(YZ) )
PBZ $X,YZ Probable br. if zero s($X) = 0) @ u
064( u(@) + 4 · s(YZ) )
BNZ $X,YZ Branch if nonzero s($X) 6= 0) @ u
064( u(@) + 4 · s(YZ) )
PBNZ $X,YZ Prob. br. if nonzero s($X) 6= 0) @ u
064( u(@) + 4 · s(YZ) )
BN $X,YZ Branch if negative s($X) < 0) @ u
064( u(@) + 4 · s(YZ) )
PBN $X,YZ Prob. br. if negative s($X) < 0) @ u
064( u(@) + 4 · s(YZ) )
BNN $X,YZ Branch if nonneg. s($X) � 0) @ u
064( u(@) + 4 · s(YZ) )
PBNN $X,YZ Prob. br. if nonneg. s($X) � 0) @ u
064( u(@) + 4 · s(YZ) )
BP $X,YZ Branch if positive s($X) > 0) @ u
064( u(@) + 4 · s(YZ) )
PBP $X,YZ Prob. br. if positive s($X) > 0) @ u
064( u(@) + 4 · s(YZ) )
BNP $X,YZ Branch if nonpositive s($X) 0) @ u
064( u(@) + 4 · s(YZ) )
PBNP $X,YZ Prob. br. if nonpos. s($X) 0) @ u
064( u(@) + 4 · s(YZ) )
BEV $X,YZ Branch if even s($X)%2 = 0) @ u
064( u(@)+4·s(YZ) )
PBEV $X,YZ Prob. branch if even s($X)%2 = 0) @ u
064( u(@)+4·s(YZ) )
BOD $X,YZ Branch if odd s($X)%2 = 1) @ u
064( u(@)+4·s(YZ) )
PBOD $X,YZ Prob. branch if odd s($X)%2 = 1) @ u
064( u(@)+4·s(YZ) )
Verzweigungen
■ Programmaufrufe
116
84 2 Assemblerprogrammierung
Befehle für Funktionsaufrufe
Befehl Operanden Name/Aktion Definition
GO$X,$Y,$Z Go to location
$X u
064( u(@) + 4) );
@ u
064( u($Y)+u($Z) )
$X,$Y,Z Go to location immediate$X u
064( u(@) + 4) );
@ u
064( u($Y) + u(Z) )
a) Was ist der Haupt-Unterschied zwischen dem JMP-Befehl und dem GO-Befehl?
b) Wo speichern GO-Befehle die Rücksprungadresse ab?
c) Was ist die ‘‘Rücksprungadresse’’?
d) Wenn GO Absolute Adressierung verwendet: Wie wird die Abolute Adresse (64 Bit)
im 32 Bit breiten Befehlswort abgelegt?
e) Geben Sie den Befehl an, mit dem Sie die Funktion fkt aufrufen und die Rück-
sprungadresse in Register 0 ablegen.
Aufgaben S. 81-83
Namensräume
Namensräume
■ Problem – Wie kann eine Funktion wissen, welche Variablen-Namen von anderen
Funktionen verwendet wurden? !
– Mehrfache Definition von Marken/Namen => Assembler-Fehler !
!
■ Lösung – C-Programmierung: Lokale Sichtbarkeit innerhalb des Blocks !
– MMIX: Namensvorsatz (Prefix), der vor alle Namen/Marken gestellt wird (Textersetzung)
119
Namensräume
■ PREFIX expression – Beginnt einen neuen Namensraum – Vor jeden Namen wird die Zeichenkette “expession” angefügt, falls der Name
nicht mit einem Doppelpunkt beginnt – => globale Namen können innerhalb eines Blocks durch manuelles
Hinzufügen von Doppelpunkten vor einen Namen erstellt werden !
■ PREFIX : – Beendet den Namensraum !
■ Verschachtelungen – Verschachtelungen mehrerer PREFIX-Anweisungen möglich – Eine einzige Anweisung “PREFIX :” reicht aber, um alle vorherigen PREFIX-
Anweisungen zu beenden
120
Namensräume
■ Beispiel
121
PREFIX main: LOC #2000000000000018 var_a OCTA 4 main:var_a reg_a IS $4 main:reg_a ! LOC #110 :Main LDO :reg_a,:var_a GLOBAL!! LDO :fkt:reg_a,:fkt:var_a OTHER NAMESPACE LDO reg_a,var_a LOCAL ! GO $0,:fkt GLOBAL TRAP 0,:Halt,0 GLOBAL ! PREFIX : !// Ab hier kein “Prefixing” mehr