Saalübung - Assembler

Werbung
Saalübung Informatik II
SS 2006
Einführung
z
z
SPIM-Assembler
Teil 1
z
z
Einführung
z
z
Übung zur SPIM-Assemblerprogrammierung
Assembler ist die elementare Sprache eines
Prozessors
Assemblerbefehle repräsentieren die
Basisoperationen des Prozessors
Programmieren in Assembler bringt
Verständnis für den Aufbau des Prozessors
Einführung
Maschinenbefehl ist eine Folge von Nullen und
Einsen, welche dem Prozessor die auszuführende
Operation mitteilt
z
0000 0001 0010 1011 1000 0000 0010 0000
z
Diese Operation sieht in Assembler so aus:
add $t0, $t1, $t3
leichter verständlich
z
z
„Unüblich“ in Assembler zu programmieren
Kommunikation mit dem Prozessor erfolgt
über eine Programmiersprache
Höhere Programmiersprachen sind z.B.
Pascal, Fortran, C, C++, Java
Programme in höheren Programmiersprachen sind hardwareunabhängig
Programmiersprachen
z
z
z
High-Level-Language (z.B. C, C++, früher Fortran)
|
| Compiler übersetzt in
|
Assemblersprache (Befehle des Prozessors)
|
| Assembler übersetzt in
|
Maschinencode (Folgen von Nullen und Einsen)
Der MIPS-Prozessor
z
z
z
z
z
z
z
z
32-Bit Architektur
jedes Register 32 Bit lang,
Speicheradressen 32 Bit,
Instruktionen 32 Bit lang
Hauptspeicher, CPU, 2 Coprozessoren
CPU und Floatingpoint-Einheit haben je 32 Register
Coprozessor 0 – für Traps und Interrupt
Dreiadressinstruktionen: Ziel, Quelle1, Quelle2
Eine einfache Anweisung in FORTRAN
z
ergebnis = faktor1 * faktor2 + 89
z
in MIPS Assembler (MIPS ~ 32-Bit-RISC-Architektur)
lw $t0, faktor1
lw $t1, faktor2
mul $t2, $t0, $t1
addi $t2, $t2, 89
sw $t2, ergebnis
z
in VAX Assembler (VAX ~ 32-Bit-CISC-Architektur)
MULL3 faktor1, faktor2, R5
ADDL3 R5, 89, ergebnis
Hauptspeicher
z
z
z
z
z
MIPS Hauptspeicher ist ein Feld von 2^32 Bytes
Jedes Byte hat eine 32 Bit lange Adresse
Jedes Byte enthält eine 8-Bit lange Zeichenkette
Adressen des MIPS Hauptspeichers von 0x00000000
bis 0xFFFFFFFF (flat)
Die ersten 2^31 Byte sind für Nutzerprogramme und
Daten reserviert, die andere Hälfte ist für spezielle
Zwecke reserviert
MIPS-Speichermodell
MIPS Speicherarchitektur
z
Load- and Store-Architektur
–
–
Hauptspeicheraufbau
Daten und Befehle müssen vom Hauptspeicher vor
Ausführung/Bearbeitung in den Prozessor geladen werden
Operationen im Hauptspeicher sind nicht möglich
z
Laden: eine Bitfolge beginnend ab angegebener Adresse im
Hauptspeicher wird in den Prozessor geladen
z
Speichern: Bitfolge wird von Register des Prozessors in den
Hauptspeicher an angegebene Adresse kopiert
Speicheraufbau
z
Textsegment: enthält Benutzerprogramme
z
Datensegment: enthält Benutzerdaten für obige
Programme
z
Stacksegment: (Kellersegment), für
Zwischenspeicherung von lokalen Userdaten
(Argumente, Zwischenergebnisse, gerettete
Registerwerte etc.)
Register der CPU
z
32 Register mit Länge 32-Bit
z
Register universell einsetzbar (general purpose)
z
$0 ... $31 Bezeichnung der Register
z
Außerdem mnemonische Bezeichnung, spiegelt Benutzung
wieder
z
$0 z.B. Zero – hartverdrahtete Null, kann nicht beschrieben
werden
Register – Koprozessor 1 – FP
z
32 floating point Register, Länge 32 Bit
Register der CPU
Register Nr.
Name
Benutzt für
$0
$1
$2, $3
$4 - $7
$8 - $15
$16 - $23
$24, $25
$26, $27
$28
$29
$30
$31
Zero
$at
$v0, $v1
$a0 - $a3
$t0 - $t7
$s0 - $s7
$t8, $t9
$k0, $k1
$gp
$sp
$fp
$ra
Nullregister
Reserviert für Assembler
Ergebnisse aus Unterprogramm
Argumente für ein Unterprogramm
Temporär, wird nicht gesichert bei UP
GeSichert bei UP
Temporär, wird nicht gesichert bei UP
Kernel, reserviert für BS
Global Pointer
Stack Pointer
Frame Pointer
Rückkehr-Adresse
Maschinenzyklus
1.
2.
z
Bezeichnung $f0 ... $f31
3.
z
Für doppelte Genauigkeit werden zwei
Register zusammengefasst: $f0 und $f1 bis
$f30 und $f31
z
Instruction Fetch: Laden der Instruktion
Erhöhen des Programmzählers (PC)
Ausführen der Operation (Execute)
Instruktionen werden sequentiell
abgearbeitet (nacheinander)
Maschinenbefehle
z
z
z
z
z
z
32 Bit lang
z.B. addu $10, $9, $8
000000 01001 01000 01010 00000 100001
--9-- --8-- --10-6 Bit Befehlscode,
5 Bit Quellreg.1, 5 Bit Quellreg.2, 5 Bit Zielreg.,
5 Bit 00000 (Shift)
6 Bit Befehlscode
Simulator SPIM
z
Simulator verfügbar für verschiedene
Betriebssysteme
–
z
Bildet den MIPS R2000/3000-Prozessor nach
z
Programme werden mit Editor geschrieben, gesichert und dann
in den Simulator geladen
z
Simulator übernimmt Syntaxprüfung beim Laden, Programm
wird im Simulator abgearbeitet – Registerinhalte können
überprüft werden – Fehler führen i.a. nicht zum Absturz des
Computers, beim Test auf realem Prozessor durchaus üblich
z
Unterstützt Breakpoints und Single Step, einfache Ein- und
Ausgabe zur Nutzerinteraktion
Befehlsübersicht
z
Befehle ◄ PDF Datei
z
Quelle:
http://www.utdallas.edu/~cantrell/ee2310/spi
m.inst.txt
http://www.cs.wisc.edu/~larus/spim.html
z
The current version of spim is 7.2.1 (August 2005)
z
Tutorial von Reinhard Nitzsche
–
Der MIPS-Simulator SPIM
http://www.mobile.ifi.lmu.de/Vorlesungen/ss05/tgi/doku/Spi
m_Tutorial.pdf
SPIM unter Windows
Starten von PCSpim
Zeile im Programmcode-Fenster
Register
der CPU
Programm
code
Sicht auf den
Speicher
[0x00400000]
0x8fa40000
lw $4, 0($29) ;
89: lw $a0, 0($sp)
• Speicheradresse
• Numerische Codierung der Instruktion
• Instruktion
Statusinformationen
• Zeilennummer im Quellcode
• Quellcode-Zeile
PCSpim Settings
Beispielprogramm
z
Programmstruktur – einfaches Beispiel
.data
Msg: .asciiz "Hallo, Welt!"
.text
main:
li $v0, 4
la $a0, Msg
syscall
jr $ra
Stack
Stack in MIPS
z
Stack – Form der Speicher-Organisation
z
Verhalten des Stacks – LIFO – last in first out
(vergleichbar mit Stapel z.B. Teller)
$sp Stackpointer: zeigt
auf das oberste
Element des Stacks
z
Datenelemente des Stacks in MIPS sind 32Bit Worte
81
-92
oberstes Element
unterstes Element
Stack in MIPS
Unterprogramme
Push
# der zu speichernde Wert stehe in $t0
sub $sp,$sp,4
# Stackpointer um 4 erniedrigen
sw $t0,($sp)
# speichert den Wert an die oberste
# Stackposition
Pop
# hole aus stack wert nach $t0
lw $t0,($sp)
# kopiert den wert nach $t0
add $sp,$sp,4
# Stackpointer zeigt auf neues letztes
# Element
z
Unterprogramme
Coprozessor
main:
.text
...
jal sub_routine
...
Grundsatz der Programmierung
„share identical code“
~
„Schreibe nichts doppelt!“
z
Daraus ergibt sich eine Verringerung
–
–
–
des Wartungsaufwands
des Programmier- und Prüfungsaufwands und
des Platzbedarfs
z
verarbeitet Fließkommazahlen
z
Austausch von Registerwerten zwischen
CPU und Coprozessor ist möglich
z
Aber: in der CPU werden lediglich Festkommazahlen verarbeitet
# jump and link
############################
# Name des Unterprogramms
# Eingabe:
# $a0 – Argument 1
# Ausgabe:
# $v0 – Ergebnis
############################
sub_routine:
# Stack Behandlung
# Aktionen
# Stack Behandlung
jr $ra
# Rücksprung
ggf. Breakpoint setzen und
per Single Step die Routine
abarbeiten
Beispiel – Floating Point
.data
v1: .double 3.1
v2: .double 0.8
max: .double 12.51
.text
main:
l.d $f4, v1
l.d $f6, v2
l.d $f8, max
# lade v1 nach $f4
# lade v2 nach $f6
# lade max nach $f8
add.d $f4, $f4, $f6
c.le.d $f4, $f8
# $f4 = $f4+$f6
# prüfe ob $f4 kleiner gleich $f8, wenn ja float-flag=true
# andernfalls float-flag=false
# wenn float-flag=true springe zu loop
loop:
bc1t loop
jr $ra
Herunterladen