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
Laden von Halfword mit Sign‐Extension:
lh { Beispiel: lh $t0, 22($s3) }
Laden von Halfword ohne Sign‐Extension:
lhu { Beispiel: lhu $t0, 22($s3) }
Speichern von Halfword:
sh { Beispiel: sh $t0, 22($s3) }
Addieren und Laden von Konstanten
Grundlagen der Rechnerarchitektur ‐Assembler 17
C Programm:
x = x + 4;
Sei hierbei:
x in Register $s3 gespeichert
MIPS Instruktion:
MIPS erlaubt negative Konstanten und braucht damit kein ‚subi‘.
MIPS hat ein spezielles Register $zero, welches 0 ‘hart verdrahtet‘ speichert.
C Programm:
x = 42;
Sei hierbei:
x in Register $s3 gespeichert
MIPS Instruktion:
Zwischenbilanz der MIPS Architektur
CPU
$0 . . .
$31 Arithmetic
Unit
Registers
Memory
Name Nummer Verwendung
$zero 0 Konstante 0
$at 1
$v0‐$v1 2‐3
$a0‐$a3 4‐7
$t0‐$t7 8‐15 Temporäre Register
$s0‐$s7 16‐23 „saved“ temporäre Reg.
$t8‐$t9 24‐25 Temporäre Register
$k0‐$k1 26‐27
$gp 28
$sp 29
$fp 30
$ra 31
Zusammenfassung der behandelten Instruktionen
Grundlagen der Rechnerarchitektur ‐Assembler 19
Instruktion Bedeutung
Arithmetik add
rd, rs, rt Register rd = Register rs + Register rt
addi
rt, rs, imm Register rt = Register rs + Konstante imm
subrd, rs, rt Register rd = Register rs –Register rt
Laden
lb
rt, address Lade Byte an der Adresse address in Register rt.
Das Byte ist sign‐extended.
lbu
rt, address Lade Byte an der Adresse address in Register rt.
lh
rt, address Lade Half‐Word an der Adresse address in Register rt.
Das Half‐Word ist sign‐extended.
lhu
rt, address Lade Half‐Word an der Adresse address in Register rt.
lw
rt, address Lade Word an der Adresse address in Register rt.
Speichern
sb
rt, address Speichere unterstes Byte des Registers rt an Adresse address
shrt, address Speichere unteres Half‐Word des Registers rt an Adresse
address
sw
rt, address Speichere Inhalt des Registers rt an Adresse address.
Quiz
addi $s0, $zero, 4 # lw $s1, 0($s0) # lw $s2, 4($s0) # add $s1, $s1, $s1 # add $s1, $s1, $s2 # addi $s1, $s1, 1 # sw $s1, 0($s0) #
0 421
4 12
8 4
12 33
…
Adr esse
Inhalt (Word)
Speicher zu Beginn
0 4 8 12
…
Adr esse
Inhalt (Word)
Speicher nach Instruktionsdurchlauf
Darstellung von Instruktionen
Grundlagen der Rechnerarchitektur ‐Assembler 21
Übersetzung aus Assembler in Maschinensprache
add $t0, $s1, $s2
0 17 18 8 0 32
6 Bit Opcode
5 Bit Source1
5 Bit Source2
5 Bit Dest
5 Bit Shamt
6 Bit Funct
00000010001100100100000000100000
Assembler‐
Instruktion
Maschinen‐
Instruktion
Name Nr
$t0 8
$t1 9
$t2 10
$t3 11
$t4 12
$t5 13
$t6 14
$t7 15 Name Nr
$s0 16
$s1 17
$s2 18
$s3 19
$s4 20
$s5 21
$s6 22
$s7 23