Grundlagen der Rechnerarchitektur
MIPS‐Assembler
Übersicht
• Arithmetik, Register und Speicherzugriff
• Darstellung von Instruktionen
• Logische Operationen
• Weitere Arithmetik
• Branches und Jumps
• Prozeduren
• 32‐Bit‐Konstanten und Adressierung
• Synchronisation
• Exceptions
• Pseudoinstruktionen, Direktiven und Makros
Motivation
Grundlagen der Rechnerarchitektur ‐Assembler 3
Warum ein Assembler‐Kurs?
• Wir wollen etwas über Rechnerarchitektur lernen.
Assembler ist ein Teil davon.
• Nach dem Erlernen von Assembler eines Systems, lernt man Assembler anderer Rechner kinderleicht
• Während wir uns mit Assembler beschäftigen
lernen wir auch generelle Konzepte kennen, wie
die Hardware in Computern und eingebetteten
Systemen organisiert ist
Vor‐ und Nachteile von Assembler
• Wann sollte man Assembler programmieren?
– Code‐Größe oder Geschwindigkeit sollen bis auf das äußerste ausgereizt werden
– Verwendung spezieller Maschineninstruktionen, die ein Compiler nicht nutzt (in der Regel bei CISC)
– Es gibt für die Computer‐Hardware keine höhere Sprache
• Meist wird ein hybrider Ansatz gewählt
– Man programmiert das meiste in einer High‐Level‐Sprache
– Nur kleine Teile des gesamten Codes werden direkt in Assembler optimiert
• Nachteil von Assembler
– Programme laufen nur für den Hardwaretyp für den diese programmiert sind
– Assembler‐Code ist im Vergleich zu High‐Level‐Sprachen deutlich länger
• Programmieren dauert deutlich länger
• Programmieren ist fehleranfälliger (insbesondere wegen fehlender Struktur)
Grundlagen der Rechnerarchitektur ‐Assembler 5
Assembler am Beispiel der MIPS‐Architektur
• Frühere Einsatzgebiete MIPS
– Silicon Graphics Unix‐Workstations (z. B. SGI Indigo2) – Silicon Graphics Unix‐Server (z. B. SGI Origin2000)
– DEC Workstations (z.B. DECstation‐Familie und DECsystem) – Siemens bzw. SNI Server der RM‐Serie
– Control Data Corporation Computer des Typs CDC 4680
• Heutiger Einsatz von MIPS in eingebetteten Systemen
– Cobalt‐Server bis RaQ/Qube2 – BMW‐Navigationssysteme
– die Fritz!Box
– Satellitenreceiver – Dreambox
– Konica Minolta DSLRs
– Sony‐ und Nintendo‐Spielkonsolen
Quelle der Liste: de.wikipedia.org/wiki/MIPS‐Architektur
7
Warum gerade MIPS (und nicht Intel x86)?
• MIPS‐Instruktionssatz ist klar und einfach (RISC)
• Sehr gut in Lehrbüchern beschrieben
• Sehr ähnlich zu vielen modernen Prozessoren (z.B. ARM; schauen wir uns eventuell auch noch kurz an)
• MIPS ist eine kommerziell relevante Instruktionssatzarchitektur.
(z.B. 2002 wurden fast 100 Millionen MIPS Prozessoren hergestellt)
Grundlagen der Rechnerarchitektur ‐Assembler
Begleitend: SPIM‐ und MARS‐Simulator
Programmieren lernt man nicht durch zuschauen!
Alle Konzepte sollte man hier selber ausprobieren!
Arithmetik, Register und Speicherzugriff
Grundlagen der Rechnerarchitektur ‐Assembler 9
Arithmetik und Zuweisungen
C Programm:
a = b + c;
d = a – e;
MIPS Instruktionen:
Einfache Arithmetik mit Zuweisung
C Programm:
f = (g + h) – (i + j);
MIPS Instruktionen (verwende temporäre Variablen t0 und t1):
Komplexere Arithmetik mit Zuweisung
Die Operanden sind Register
Grundlagen der Rechnerarchitektur ‐Assembler 11
C Programm:
f = (g + h) – (i + j);
Sei hierbei:
g in Register $s1 gespeichert h in Register $s2 gespeichert i in Register $s3 gespeichert j in Register $s4 gespeichert f in Register $s0 gespeichert
MIPS Instruktionen (verwende temporäre Register $t0 und $t1):
add $t0, $s1, $s2 # t0=g+h add $t1, $s3, $s4 # t1=i+j sub $s0, $t0, $t1 # f=t0-t1
Voriges Beispiel: Komplexere Arithmetik mit ZuweisungMIPS Registergröße = 32 Bit
Assembler‐Syntax:
Das Zeichen # leitet für den Rest der Zeile einen Kommentar ein.
Der Text wird vom Assembler einfach ignoriert.
Speicher‐Operanden
C Programm:
g = h + A[8];
Sei hierbei:
g in Register $s1 gespeichert h in Register $s2 gespeichert
Basisadresse von A in Register $s3
MIPS Instruktionen (verwende temporäres Register $t0):
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Alignment‐Restriction
Grundlagen der Rechnerarchitektur ‐Assembler 13
Zugriff auf A[8], wenn Basisadresse von A in Register $s3 gespeichert?
Bildquelle: David A. Patterson und John L. Hennessy, „Computer Organization and Design“, Fourth Edition, 2012
Laden und Speichern
C Programm:
A[12] = h + A[8];
Sei hierbei:
Basisadresse von A in Register $s3 und h in Register $s2 gespeichert
MIPS Instruktionen (verwende temporäre Register $t0):
Laden und Speichern von Bytes
Grundlagen der Rechnerarchitektur ‐Assembler 15
C Programm:
A[12] = h + A[8];
Sei hierbei:
Basisadresse von A in Register $s3 h in Register $s2 gespeichert
MIPS Instruktionen (verwende temporäre Register $t0):
Sei A[8] = 01110010. Was passiert im obigen Beispiel bei lb mit $t0 genau?
LSB
$t0 MSB
Sei A[8] = 11110010. Was passiert im obigen Beispiel bei lb mit $t0 genau?
LSB
$t0 MSB
Weitere Befehle zum Laden und Speichern
Laden von Byte ohne Sign‐Extension:
lbu { Beispiel: lbu $t0, 27($s3) }
Was passiert im obigen Beispiel mit $t0, wenn 27($s3) = 11001000?
LSB
$t0 MSB