13.07.2015 Aufrufe

Technische Grundlagen der Informatik – Kapitel 6

Technische Grundlagen der Informatik – Kapitel 6

Technische Grundlagen der Informatik – Kapitel 6

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Technische</strong> <strong>Grundlagen</strong><strong>der</strong> <strong>Informatik</strong> – <strong>Kapitel</strong> 6Prof. Dr. Sorin A. HussFachbereich <strong>Informatik</strong>TU Darmstadt


<strong>Kapitel</strong> 6: Themen• Prozessorarchitektur• Entwurfsprinzipien• Befehle• Speicherorganisation• Programmierung- Maschinensprache- Assemblersprache- HochspracheWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 2


Einleitung• Nun Sprung auf eine höhereAbstraktionsebene• Erstmal …• Architektur: Programmierer -Sicht aufeinen Computer• Definiert durch Instruktionen(Operationen) und Operanden• Mikroarchitektur: Hardware-Implementierung <strong>der</strong> Architektur• Kommt im Detail in <strong>Kapitel</strong> 7BetriebssystemeAnwendungs-SoftwareMikroarchitekturArchitekturDigitalschaltungenLogikAnalogschaltungenBauelementeProgrammeGerätetreiberInstruktionenRegisterDatenpfadeSteuerwerkeAddiererSpeicherAND GatterNOT GatterVerstärkerFilterTransistorenDiodenPhysikElektronenWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 3


Assemblersprache• Programmieren in Sprache des Computers• Instruktionen / Befehle: Einzelne Worte• Befehlssatz: Gesamtes Vokabular• Befehle geben Art <strong>der</strong> Operation und ihre Operanden an• Zwei Darstellungen• Assemblersprache: für Menschen lesbare Schreibweise für Instruktionen• Maschinensprache: maschinenlesbares Format (1’en und 0’en)• MIPS Architektur:• Von John Hennessy und Kollegen in Stanford in den 1980ern entwickelt• In vielen Computern verwendet• Silicon Graphics, Nintendo, Sony, Cisco, …• Gut zur Darstellung von allgemeinen Konzepten• Vieles auch auf an<strong>der</strong>e Architekturen übertragbarWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 4


John Hennessy• Präsident <strong>der</strong> Universität Stanford• Professor in Elektrotechnik undInformationstechnik in Stanford seit 1977• Miterfin<strong>der</strong> des Reduced Instruction SetComputers (RISC)• Entwickelte MIPS-Architektur in Stanford in1984 und war Mitgrün<strong>der</strong> von MIPSComputer Systems• Bis 2004: Über 300 Millionen MIPSProzessoren verkauftWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 5


Entwurfsprinzipien für ArchitekturenJohn Hennessy (Stanford) und David Patterson (Berkeley):1. Regularität vereinfacht Entwurf2. Mach den häufigsten Fall schnell3. Kleiner ist schneller4. Ein guter Entwurf verlangt gute KompromisseWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 6


Befehle: AdditionHochsprachea = b + c;MIPS Assemblerspracheadd a, b, c• add: Befehlsname (mnemonic) gibt die Art <strong>der</strong> auszuführendenOperation an• b, c: Quelloperanden auf denen die Operation ausgeführt wird• a:Zieloperand in den das Ergebnis eingetragen wirdWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 7


Befehl: Subtraktion• Subtraktion ist ähnlich zur Addition. Nur <strong>der</strong> Befehlsname än<strong>der</strong>t sich.Hochsprachea = b - c;MIPS Assemblersprachesub a, b, c• sub: Befehlsname gibt die Art <strong>der</strong> auszuführenden Operation an• b, c: Quelloperanden auf denen die Operation ausgeführt wird• a: Zieloperand in den das Ergebnis eingetragen wirdWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 8


Entwurfsprinzip 1Regularität vereinfacht Entwurf- Konsistentes Befehlsformat- Gleiche Anzahl von Operanden- Zwei Quellen, ein Ziel- Leichter zu kodieren und in Hardware zu bearbeitenWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 9


Befehle: Komplexere Abläufe• Komplexere Abläufe werden durch Folgen von einfachenBefehlen realisiertHochsprachea = b + c - d;// Kommentare bis Zeilenende/* mehrzeiliger Kommentar */MIPS Assemblerspracheadd t, b, c # t = b + csub a, t, d # a = t - dWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 10


Entwurfsprinzip 2Mach den häufigen Fall schnell- MIPS enthält nur einfache, häufig verwendete Befehle- Hardware zur Dekodierung und Ausführung <strong>der</strong> Befehle kann einfach, kleinund schnell sein- Komplexe Anweisungen (die nur seltener auftreten) können durch Folgenvon einfachen Befehlen realisiert werden- MIPS ist ein Computer mit reduziertem Befehlssatz (reduced instruction setcomputer, RISC)- Alternative: Computer mit komplexem Befehlssatz (complex instruction setcomputer, CISC)- Beispiel: Intel IA-32 / x86 (weit verbreitet in PCs)- Befehl: Kopiere Zeichenfolge im Speicher umherWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 11


Operanden: Register• Speicher ist langsam• Viele Architekturen haben deshalb kleine Anzahl von schnellen Registern• MIPS hat 32 Register, jedes 32b breit• Wird deshalb auch “32b Architektur” genannt• Es gibt auch eine 64b-Version von MIPS• … wird hier aber nicht weiter behandeltWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 13


Entwurfsprinzip 3Kleiner ist schneller- MIPS stellt nur eine kleine Anzahl von Registern bereit- Kann in schnellerer Hardware realisiert werden als größeres RegisterfeldWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 14


MIPS RegisterfeldName Registernummer Verwendungszweck$0 0 Konstante Null$at 1 Temporäre Variable für Assembler$v0-$v1 2-3 Rückgabe von Werten aus Prozedur$a0-$a3 4-7 Aufrufparameter in Prozedur$t0-$t7 8-15 Temporäre Variablen$s0-$s7 16-23 Gesicherte Variablen$t8-$t9 24-25 Mehr temporäre Variablen$k0-$k1 26-27 Temporäre Variablen für Betriebssystem$gp 28 Zeiger auf globale Variablen im Speicher$sp 29 Stapelzeiger im Speicher$fp 30 Zeiger auf aktuellen Aufruf-Frame im Speicher$ra 31 Rücksprungadresse aus ProzedurWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 15


Operanden: Register• Register:• Kenntlich gemacht durch dem Namen vorangestelltes Dollar-Zeichen• Beispiel: Register 0 wird geschrieben als “$0”• Gelesen als: “Register Null” o<strong>der</strong> “Dollar Null”.• Bestimmte Register für bestimmte Verwendungszwecke:• Beispiele• $0 enthält immer den konstanten Wert 0.• Gesicherte Register ($s0-$s7) für das Speichern von Variablen• Temporäre Register ($t0 - $t9) für das Speichern vonZwischenergebnissen während einer komplizierteren Rechnung• Zunächst benutzen wir nur• Temporäre Register ($t0 - $t9)• Gesicherte Register ($s0 - $s7)• Später mehr …WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 16


Befehle mit Registerangaben• Rückblick auf add-BefehlHochsprachea = b + cMIPS Assemblersprache# $s0 = a, $s1 = b, $s2 = cadd $s0, $s1, $s2WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 17


Operanden: Speicher• Daten passen nicht alle in 32 Register• Lege Daten im Hauptspeicher ab• Hauptspeicher ist groß (GB…TB) und kann viele Daten halten• Ist aber auch langsam• Speichere häufig verwendete Daten in Registern• Kombiniere Register und Speicher zum Halten von Daten• Ziel: Greife schnell auf große Mengen von Daten zuWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 18


Wort-Adressierung von Daten im Speicher• Jedes 32-bit Datenwort hat eine eindeutige AdresseWortadresseDaten00000003 4 0 F 3 0 7 8 800000002 0 1 E E 2 8 4 200000001 F 2 F 1 A C 0 700000000 A B C D E F 7 8Wort 3Wort 2Wort 1Wort 0WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 19


Lesen aus wort-adressiertem Speicher• Lesen geschieht durch Ladebefehle (load)• Befehlsname: load word (lw)• Beispiel: Lese ein Datenwort von <strong>der</strong> Speicheradresse 1 nach $s3• Adressarithmetik: Adressen werden relativ zu einem Register angegeben• Basisadresse ($0) plus Distanz (offset) (1)• Adresse = ($0 + 1) = 1• Jedes Register darf als Basisadresse verwendet werden• Nach Abarbeiten des Befehls hat $s3 den Wert 0xF2F1AC07Assemblersprachelw $s3, 1($0) # lese Wort 1 aus Speicher in $s3WortadresseDaten00000003 4 0 F 3 0 7 8 800000002 0 1 E E 2 8 4 200000001 F 2 F 1 A C 0 700000000 A B C D E F 7 8Wort 3Wort 2Wort 1Wort 0WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 20


Schreiben in wort-adressiertem Speicher• Schreiben geschieht durch Speicherbefehle (store)• Befehlsname: store word (sw)• Beispiel: Schreibe (speichere) den Wert aus $t4 in Speicherwort 7• Offset kann dezimal (Standard) o<strong>der</strong> hexadezimal angegeben werden• Adressarithmetik:• Basisadresse ($0) plus Offset (0x7)• Adresse: ($0 + 0x7) = 7• Jedes Register darf als Basisadresse verwendet werdenAssemblersprache (nicht MIPS!)sw $t4, 0x7($0) # schreibe Wert aus $t4 in Speicherwort 7WortadresseDaten00000003 4 0 F 3 0 7 8 800000002 0 1 E E 2 8 4 200000001 F 2 F 1 A C 0 700000000 A B C D E F 7 8Wort 3Wort 2Wort 1Wort 0WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 21


Byte-addressierbarer Speicher• Jedes Byte hat eine individuelle Adresse• Speicherbefehle können auf Worten o<strong>der</strong> Bytes arbeiten• Worte: lw / sw Bytes: lb / sb• Jedes Wort enthält vier Bytes• Adressen von Worten sind also vielfache von 4Byte-AdresseDaten0000000C0000000800000004000000004 0 F 3 0 7 8 80 1 E E 2 8 4 2F 2 F 1 A C 0 7A B C D E F 7 8Wort 3Wort 2Wort 1Wort 0Wortbreite = 4 BytesWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 22


Lesen aus byte-addressiertem Speicher• Adresse eines Speicherwortes muss nun mit 4 multipliziert werden• Byte-Addresse von Wort 2 ist 2 × 4 = 8• Byte-Addresse von Wort 10 is 10 × 4 = 40 (0x28)• Beispiel: Lade Wort 1 aus Byte-Adresse 4 nach $s3• Nach dem Befehl enthält $s3 den Wert 0xF2F1AC07• MIPS ist byte-adressiert, nicht wort-adressiert!Assemblersprache (nicht MIPS!)lw $s3, 4($0) # Lese Wort 1 an Byte-Adresse 4 nach $s3Byte-AdresseDaten0000000C0000000800000004000000004 0 F 3 0 7 8 80 1 E E 2 8 4 2F 2 F 1 A C 0 7A B C D E F 7 8Wort 3Wort 2Wort 1Wort 0Wortbreite = 4 BytesWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 23


Schreiben in byte-addressiertem Speicher• Beispiel: Schreibe Wert aus $t7 in Speicheradresse 0x2C (44)MIPS Assemblersprachesw $t7, 44($0) # schreibe $t7 nach Byte-Adresse 44Byte-AdresseDaten0000000C0000000800000004000000004 0 F 3 0 7 8 80 1 E E 2 8 4 2F 2 F 1 A C 0 7A B C D E F 7 8Wort 3Wort 2Wort 1Wort 0Wortbreite = 4 BytesWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 24


Speicherorganisation: Big-Endian und Little-Endian• Schemata für Nummerierung von Bytes in einem Wort• Wort-Adresse ist bei beiden gleich• Little-Endian: Bytes werden vom nie<strong>der</strong>stwertigen Ende an gezählt• Big-Endian : Bytes werden vom höchstwertigen Ende an gezähltBig-EndianByte-AdresseWortAdresseLittle-EndianByte-AdresseC D E F8 9 A B4 5 6 70 1 2 3MSB LSBC840F E D CB A 9 87 6 5 43 2 1 0MSB LSBWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 25


Speicherorganisation: Big-Endian und Little-Endian• Aus Jonathan Swift’s Gullivers Reisen• Little-Endians schlagen Eier an <strong>der</strong> schmalen Seite auf• Big-Endians schlagen Eier an <strong>der</strong> breiten Seite auf• Welche Organisation benutzt wird ist im Prinzip egal …• … außer wenn unterschiedliche Systeme Daten austauschen müssen!Big-EndianByte-AdresseWortAdresseLittle-EndianByte-AdresseC D E F8 9 A B4 5 6 70 1 2 3MSB LSBC840F E D CB A 9 87 6 5 43 2 1 0MSB LSBWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 26


Beispiel: Big-Endian und Little-Endian• Annahme: $t0 enthält den Wert 0x23456789• Programm:sw $t0, 0($0)lb $s0, 1($0)• Fragen: Welchen Wert hat $s0 nach Ausführung auf einem …• … Big-Endian Prozessor?• … Little-Endian Prozessor?WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 27


Beispiel: Big-Endian und Little-Endian• Annahme: $t0 enthält den Wert 0x23456789• Programm:sw $t0, 0($0)lb $s0, 1($0)• Fragen: Welchen Wert hat $s0 nach Ausführung auf einem …• … Big-Endian Prozessor? 0x00000045• … Little-Endian Prozessor? 0x00000067Byte-AdresseDatenwertBig-Endian0 1 2 323 45 67 89WortadresseWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 280Little-Endian3 2 1 023 45 67 89MSB LSB MSB LSBByte-AdresseDatenwert


Entwurfsprinzip 4Ein guter Entwurf verlangt gute Kompromisse- Mehrere Befehlsformate erlauben Flexibilität …- add, sub: verwenden drei Register als Operanden- lw, sw: verwendet zwei Register und eine Konstante als Operanden- … aber Anzahl von Befehlsformaten sollte klein sein- Entwurfsprinzip 1: Regularität vereinfacht Entwurf- Entwurfsprinzip 3: Kleiner ist schnellerWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 29


Operanden: Konstante Werte in Befehl(immediates)• lw und sw zeigen die Verwendung von konstanten Werten (immediates)• Direkt im Befehl untergebracht, deshalb auch Direktwerte genannt• Brauchen kein eigenes Register o<strong>der</strong> Speicherzugriff• Befehl “add immediate” (addi) addiert Direktwert auf Register• Direktwert ist 16b ZweierkomplementzahlHochsprachea = a + 4;b = a – 12;MIPS Assemblersprache# $s0 = a, $s1 = baddi $s0, $s0, 4addi $s1, $s0, -12WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 30


Maschinensprache• Computer verstehen nur 0’en und 1’en• Maschinensprache: Binärdarstellung von Befehlen• 32b Befehle• Regularität vereinfacht Entwurf: Daten und Befehle sind beides 32b Worte• Drei Befehlsformate• R-Typ: Operanden sind nur Register• I-Typ: Register und ein Direktwert• J-Typ: für Programmsprünge (kommt noch)WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 31


Befehlsformat R-Typ• Register Typ• 3 Registeroperanden• rs, rt: Quellregister• rd: Zielregister• An<strong>der</strong>e Angaben in binärkodiertem Befehl:• op: Operations-Code o<strong>der</strong> Opcode (ist 0 für Befehle vom R-Typ)• funct: Auswahl <strong>der</strong> genauen FunktionOpcode und Funktion zusammen bestimmen die auszuführendeOperation• shamt: Schiebeweite für Shift-Befehle, sonst 0R-Typop rs rt rd shamt funct6 bits 5 bits 5 bits 5 bits 5 bits 6 bitsWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 32


Beispiele für Befehle vom R-TypAssemblerspracheadd $s0, $s1, $s2sub $t0, $t3, $t5Fel<strong>der</strong> in Befehlswortop rs rt rd shamt funct0 17 18 16 0 320 11 13 8 0 346 bits 5 bits 5 bits 5 bits 5 bits 6 bitsMaschinenspracheop rs rt rd shamt funct000000 10001 10010 10000 00000 100000000000 01011 0110101000 00000 1000106 bits 5 bits 5 bits 5 bits 5 bits 6 bits(0x02328020)(0x016D4022)Beachte an<strong>der</strong>e Reihenfolge <strong>der</strong> Register in Assembler-Sprache:add rd, rs, rtWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 33


Befehlsformat I-Typ• Immediate-Typ• 3 Operanden:• rs: Quellregister• rt: Zielregister• imm: 16b Direktwert im Zweierkomplement• An<strong>der</strong>e Angaben:• op: Opcode• Regularität vereinfacht Entwurf: Alle Befehle haben einen Opcode• Operation wird bei I-Typ nur durch Opcode bestimmt• Keine Angabe über Funktion nötig (o<strong>der</strong> vorhanden!)I-Typop rs rt imm6 bits 5 bits 5 bits 16 bitsWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 34


Beispiel für Befehle vom I-TypAssemblerspracheaddi $s0, $s1, 5Fel<strong>der</strong> im Befehlswortop rs rt imm8 17 16 5addi $t0, $s3, -12lw $t2, 32($0)8 19 8 -1235 0 10 32sw$s1, 4($t1)43 9 17 46 bits 5 bits 5 bits 16 bitsBeachte unterschiedliche Reihenfolgevon Registern in Assembler- undMaschinenspracheaddi rt, rs, immlw rt, imm(rs)sw rt, imm(rs)WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 35Maschinenspracheop rs rt imm001000 10001 10000 0000 0000 0000 0101001000 10011 01000 1111 1111 1111 0100100011 00000 01010 0000 0000 0010 0000101011 01001 10001 0000 0000 0000 01006 bits 5 bits 5 bits 16 bits(0x22300005)(0x2268FFF4)(0x8C0A0020)(0xAD310004)


Befehlsformat J-Typ• Jump-Typ• 26b Adressoperand (addr)• Verwendet für Sprungbefehle (j)J-Typopaddr6 bits 26 bitsWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 36


Übersicht über BefehlsformateR-Typop rs rt rd shamt funct6 bits 5 bits 5 bits 5 bits 5 bits 6 bitsI-Typop rs rt imm6 bits 5 bits 5 bits 16 bitsJ-Typopaddr6 bits 26 bitsWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 37


Flexibilität durch gespeicherte Programme• 32b Befehle und Daten im Speicher• Folgen von Befehlen bestimmen Verhalten• Einziger Unterschied zwischen zwei Anwendungen• Ausführen von unterschiedlichen Programmen• Ohne Neuverdrahten o<strong>der</strong> Neuaufbau von Hardware• Nur neues Programm als Maschinensprache im Speicher ablegen• Die Hardware des Prozessors führt Programm schrittweise aus:• Holt neue Befehle aus dem Speicher (fetch) in richtiger Reihenfolge• Führt die im Befehl verlangte Operation aus• Programmzähler (program counter, PC)• Zeigt Adresse des auszuführenden Befehls an• Bei MIPS: Programmausführung beginnt auf Adresse 0x00400000WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 38


Im Speicher abgelegtes ProgrammAssemblersprachelw $t2, 32($0)add $s0, $s1, $s2addi $t0, $s3, -12sub $t0, $t3, $t5Maschinensprache0x8C0A00200x023280200x2268FFF40x016D4022Programm im SpeicherAdresseBefehle0040000C 0 1 6 D 4 0 2 200400008 2 2 6 8 F F F 400400004 0 2 3 2 8 0 2 000400000 8 C 0 A 0 0 2 0PCWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 39Hauptspeicher


Maschinensprache verstehen• Beginn mit Entschlüsseln des Opcodes• Opcode bestimmt Bedeutung <strong>der</strong> an<strong>der</strong>en Bits• Wenn Opcode Null ist• … liegt ein Befehl im R-Format vor• Die Operation wird durch das Funktionsfeld bestimmt• Sonst• Bestimmt Opcode alleine die Operation, siehe Anhang B im Buch(0x2237FFF1)Maschinenspracheop rs rt imm001000 10001 10111 1111 1111 1111 00012 2 3 7 F F F 1op rs rt immFel<strong>der</strong> im BefehlswortAssemblersprache8 17 23 -15addi $s7, $s1, -15op rs rt rd shamt functop rs rt rd shamt funct(0x02F34022)000000 10111 10011 01000 00000 1000100 23 19 8 0 34sub $t0, $s7, $s30 2 F 3 4 0 2 2WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 40


Programmierung• Hochsprachen:• z.B. C, Java, Python, Scheme• Auf einer abstrakteren Ebene programmieren• Häufige Konstrukte in Hochsprachen:• if/else-Anweisungen• for-Schleifen• while-Schleifen• Feld (Array) zugriffe• Prozeduraufrufe• An<strong>der</strong>e nützliche Anweisungen:• Arithmetische/logische Ausdrücke• VerzweigungenWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 41


Ada Lovelace, 1815 - 1852• Schrieb das erste Computerprogramm• Sollte die Bernoulli-Zahlen auf <strong>der</strong>Analytischen Maschine von CharlesBabbage berechnen• Einziges eheliches Kind des DichtersLord ByronWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 42


Logische Befehle• and, or, xor, nor• and: nützlich zum Maskieren von Bits• Ausmaskieren aller Bits außer dem LSB:0xF234012F AND 0x000000FF = 0x0000002F• or: Nützlich zum Vereinigen von Bitfel<strong>der</strong>n• Vereinige 0xF2340000 mit 0x000012BC:0xF2340000 OR 0x000012BC = 0xF23412BC• nor: nützlich zur Invertierung von Bits:• A NOR $0 = NOT A• andi, ori, xori• 16-bit Direktwert wird erweitert mit führenden Nullbits (nicht vorzeichenerweitert)• nori wird nicht benötigtWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 43


Beispiele: Logische BefehleQuellregisterAssemblerspracheand $s3, $s1, $s2or $s4, $s1, $s2xor $s5, $s1, $s2nor $s6, $s1, $s2$s1$s2$s3$s4$s5$s61111 1111 1111 1111 0000 0000 0000 00000100 0110 1010 0001 1111 0000 1011 0111ErgebnisseWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 44


Beispiele: Logische BefehleQuellregisterAssemblerspracheand $s3, $s1, $s2or $s4, $s1, $s2xor $s5, $s1, $s2nor $s6, $s1, $s2$s1$s2$s3$s4$s5$s61111 1111 1111 11110000 0000 0000 00000100 0110 1010 00011111 0000 1011 0111Ergebnisse0100 0110 1010 00010000 0000 0000 00001111 1111 1111 11111111 0000 1011 01111011 1001 0101 11101111 0000 1011 01110000 0000 0000 00000000 1111 0100 1000WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 45


Beispiele: Logische BefehleOperandenAssemblerspracheandi $s2, $s1, 0xFA34ori $s3, $s1, 0xFA34xori $s4, $s1, 0xFA34$s1imm$s2$s3$s40000 0000 0000 0000 0000 0000 1111 11110000 0000 0000 0000 1111 1010 0011 0100Null-erweitertErgebnisseWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 46


Beispiele: Logische BefehleOperanden$s1immAssemblerspracheandi $s2, $s1, 0xFA34 $s20000 0000 00000000 00000000 1111 11110000 0000 00000000 11111010 0011 0100Null-erweitertErgebnisse0000 0000 00000000 00000000 0011 0100ori $s3, $s1, 0xFA34xori $s4, $s1, 0xFA34$s3$s40000 0000 00000000 11111010 1111 11110000 0000 00000000 11111010 1100 1011WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 47


Schiebebefehle• sll: shift left logical• Beispiel: sll $t0, $t1, 5 # $t0 > 5Schieben mit variabler Distanz:• sllv: shift left logical variable• Beispiel : sllv $t0, $t1, $t2 # $t0 > $t2WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 48


SchiebebefehleAssemblerspracheFel<strong>der</strong> in Instruktionop rs rt rd shamt functsll $t0, $s1, 2 0 0 17 8 2 0srl $s2, $s1, 2sra $s3, $s1, 20 0 17 18 2 20 0 17 19 2 36 bits 5 bits 5 bits 5 bits 5 bits 6 bitsMaschinenspracheop rs rt rd shamt funct000000 00000 10001 01000 00010 000000000000 00000 10001 10010 00010 000010000000 00000 10001 10011 00010 000011(0x00114080)(0x00119082)(0x00119883)6 bits 5 bits 5 bits 5 bits 5 bits 6 bitsWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 49


Handhabung von Konstanten• 16-Bit Konstante mit addi:Hochsprache// int ist ein vorzeichenbehaftetes 32b Wortint a = 0x4f3c;MIPS Assemblersprache# $s0 = aaddi $s0, $0, 0x4f3c• 32-Bit Konstante mit Load Upper Immediate (lui) und ori:(lui lädt den 16-Bit Direktwert in obere Registerhälfte und setzt untere Hälfte auf 0.)Hochspracheint a = 0xFEDC8765;MIPS Assemblersprache# $s0 = alui $s0, 0xFEDCori $s0, $s0, 0x8765WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 50


Multiplikation und Division• Spezialregister: lo, hi• 32b × 32b Multiplikation, 64b Produkt• mult $s0, $s1• Ergebnis in {hi, lo}• 32b Division, 32b Quotient, 32b Rest• div $s0, $s1• Quotient in lo• Rest in hi• Lesen von Daten aus Spezialregistern („move from …“)• mflo $s2• mfhi $s3WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 51


Verzweigungen und Sprünge• Än<strong>der</strong>n <strong>der</strong> Ausführungsreihenfolge von Befehlen• Arten von Verzweigungen: Beispiele• Bedingte• branch if equal (beq): Verzweige, wenn gleich• branch if not equal (bne): Verzweige, wenn ungleich• Unbedingte Verzweigungen• jump (j): Springe• jump register (jr): Springe auf Adresse aus Register• jump and link (jal): Springe und merke Adresse des nächsten BefehlsWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 52


Wie<strong>der</strong>holung: Programm im SpeicherAssemblersprachelw $t2, 32($0)add $s0, $s1, $s2addi $t0, $s3, -12sub $t0, $t3, $t5Maschinensprache0x8C0A00200x023280200x2268FFF40x016D4022Abgespeichertes ProgrammAdresseBefehle0040000C 0 1 6 D 4 0 2 200400008 2 2 6 8 F F F 400400004 0 2 3 2 8 0 2 000400000 8 C 0 A 0 0 2 0PCWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 53Hauptspeicher


Bedingte Verzweigungen (beq)# MIPS Assemblerspracheaddi $s0, $0, 4 # $s0 = 0 + 4 = 4addi $s1, $0, 1 # $s1 = 0 + 1 = 1sll $s1, $s1, 2 # $s1 = 1


Nicht genommene Sprünge (bne)# MIPS Assemblerspracheaddi $s0, $0, 4 # $s0 = 0 + 4 = 4addi $s1, $0, 1 # $s1 = 0 + 1 = 1sll $s1, $s1, 2 # $s1 = 1


Unbedingte Verzweigungen / Springen (j)# MIPS Assemblerspracheaddi $s0, $0, 4 # $s0 = 4addi $s1, $0, 1 # $s1 = 1j target # Sprunge zu targetsra $s1, $s1, 2 # nicht ausgeführtaddi $s1, $s1, 1# nicht ausgeführtsub $s1, $s1, $s0 # nicht ausgeführttarget:add $s1, $s1, $s0 # $s1 = 1 + 4 = 5WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 56


Unbedingte Verzweigungen (jr)# MIPS Assemblersprache0x00002000 addi $s0, $0, 0x20100x00002004 jr $s00x00002008 addi $s1, $0, 10x0000200C sra $s1, $s1, 20x00002010 lw $s3, 44($s1)WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 57


Konstrukte in Hochsprachen• if-Anweisungen• if/else-Anweisungen• while-Schleifen• for-SchleifenWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 58


If-AnweisungHochspracheif (i == j)f = g + h;MIPS Assemblersprache# $s0 = f, $s1 = g, $s2 = h# $s3 = i, $s4 = jf = f – i;WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 59


If-AnweisungHochspracheif (i == j)f = g + h;f = f – i;MIPS Assemblersprache# $s0 = f, $s1 = g, $s2 = h# $s3 = i, $s4 = jbne $s3, $s4, L1add $s0, $s1, $s2L1: sub $s0, $s0, $s3Beachte: Im Assembler wird auf entgegengesetzte Bedingunggeprüft (i != j) als in <strong>der</strong> Hochsprache (i == j).WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 60


If / Else -AnweisungHochspracheif (i == j)f = g + h;elsef = f – i;MIPS Assemblersprache# $s0 = f, $s1 = g, $s2 = h# $s3 = i, $s4 = jWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 61


If / Else-AnweisungHochspracheif (i == j)f = g + h;elsef = f – i;MIPS Assemblersprache# $s0 = f, $s1 = g, $s2 = h# $s3 = i, $s4 = jbne $s3, $s4, L1add $s0, $s1, $s2j doneL1: sub $s0, $s0, $s3done:WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 62


While-SchleifeHochsprache// berechnet x = ld 128MIPS Assemblersprache# $s0 = pow, $s1 = xint pow = 1;int x = 0;while (pow != 128) {pow = pow * 2;x = x + 1;}WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 63


While-SchleifeHochsprache// berechnet x = ld 128int pow = 1;int x = 0;while (pow != 128) {pow = pow * 2;x = x + 1;}MIPS Assemblersprache# $s0 = pow, $s1 = xaddi $s0, $0, 1add $s1, $0, $0addi $t0, $0, 128while: beq $s0, $t0, donesll $s0, $s0, 1addi $s1, $s1, 1j whiledone:Auch hier: Assemblersprache prüft auf entgegengesetzteBedingung (pow == 128) als Hochsprache (pow != 128).WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 64


For-SchleifeAllgemeiner Aufbau:for (Initialisierung; Bedingung; Schleifenanweisung)Schleifenrumpf• Initialisierung : wird einmal vor Ausführung <strong>der</strong> Schleife ausgeführt• Bedingung : wird vor Beginn jedes Schleifendurchlaufs geprüft• Schleifenanweisung : wird am Ende jedes Schleifendurchlaufs ausgeführt• Schleifenrumpf : wird einmal ausgeführt, wenn Bedingung wahr istWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 65


For-SchleifenHochsprache// addiere Zahlen von 0 to 9aufint sum = 0;int i;MIPS Assemblersprache# $s0 = i, $s1 = sumfor (i=0; i!=10; i = i+1) {sum = sum + i;}WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 66


For-SchleifenHochsprache// addiere Zahlen von 0 to 9aufint sum = 0;int i;for (i=0; i != 10; i = i+1) {sum = sum + i;}MIPS Assemblersprache# $s0 = i, $s1 = sumaddi $s1, $0, 0add $s0, $0, $0addi $t0, $0, 10for: beq $s0, $t0, doneadd $s1, $s1, $s0addi $s0, $s0, 1j fordone:Auch hier: Prüfen auf entgegengesetzte Bedingung inAssemblersprache (i == 10) als in Hochsprache (i != 10).WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 67


Kleiner-Als VergleicheHochsprache// addiere Zweierpotenzen// kleiner als 100MIPS Assemblersprache# $s0 = i, $s1 = sumint sum = 0;int i;for (i=1; i < 101; i = i*2) {sum = sum + i;}WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 68


Kleiner-als VergleicheHochsprache// addiere Zweierpotenzen// kleiner gleich 100int sum = 0;int i;for (i=1; i < 101; i = i*2) {sum = sum + i;}MIPS Assemblersprache# $s0 = i, $s1 = sumaddi $s1, $0, 0addi $s0, $0, 1addi $t0, $0, 101loop: slt $t1, $s0, $t0beq $t1, $0, doneadd $s1, $s1, $s0sll $s0, $s0, 1j loopdone:$t1 = 1 if i < 101.WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 69


Datenfel<strong>der</strong> (arrays)• Nützlich um auf eine große Zahl von Daten gleichen Typs zuzugreifen• Zugriff auf einzelne Elemente über Index• Größe eine Arrays: Anzahl von Elementen im ArrayWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 70


Verwendung von Arrays• Array mit 5 Elementen• Basisadresse, hier 0x12348000• Adresse des ersten Array-Elements• Index 0, geschrieben als array[0]• Erster Schritt für Zugriff auf Element: Lade Basisadresse des Arrays in Register0x123400100x1234800C0x123480080x123480040x12348000array[4]array[3]array[2]array[1]array[0]WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 71


Verwendung von Arrays// Hochspracheint array[5];array[0] = array[0] * 2;array[1] = array[1] * 2;# MIPS Assemblersprache# Basisadresse von array = $s0WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 72


Verwendung von Arrays// Hochspracheint array[5];array[0] = array[0] * 2;array[1] = array[1] * 2;# MIPS Assemblersprache# Basisadresse von array = $s0lui $s0, 0x1234 # lade 0x1234 in obere Hälfte von $S0ori $s0, $s0, 0x8000 # lade 0x8000 in untere Hälfte von $s0lw $t1, 0($s0) # $t1 = array[0]sll $t1, $t1, 1 # $t1 = $t1 * 2sw $t1, 0($s0) # array[0] = $t1lw $t1, 4($s0) # $t1 = array[1]sll $t1, $t1, 1 # $t1 = $t1 * 2sw $t1, 4($s0) # array[1] = $t1WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 73


Bearbeite Array in for-Schleife// Hochspracheint array[1000];int i;for (i=0; i < 1000; i = i + 1)array[i] = array[i] * 8;# MIPS Assemblersprache# $s0 = Basisadresse von array, $s1 = iWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 74


Bearbeite Array in for-Schleife// Hochspracheint array[1000];int i;for (i=0; i < 1000; i = i + 1)array[i] = array[i] * 8;# MIPS Assemblersprache# $s0 = Basisadresse von Array, $s1 = i# Initialisierunglui $s0, 0x23B8 # $s0 = 0x23B80000ori $s0, $s0, 0xF000 # $s0 = 0x23B8F000addi $s1, $0, 0 # i = 0addi $t2, $0, 1000 # $t2 = 1000loop:slt $t0, $s1, $t2 # i < 1000?beq $t0, $0, done # if not then donesll $t0, $s1, 2 # $t0 = i * 4 (byte offset)add $t0, $t0, $s0 # address of array[i]lw $t1, 0($t0) # $t1 = array[i]sll $t1, $t1, 3 # $t1 = array[i] * 8sw $t1, 0($t0) # array[i] = array[i] * 8addi $s1, $s1, 1 # i = i + 1j loop # repeatdone:WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 75


Zeichendarstellung im ASCII-Code• American Standard Code for Information Interchange• Definiert für gängige Textzeichen einen 7b breiten Code• Einfach, aber schon älter• Heute Unicode: breitere Darstellung für alle Textzeichen• Beispiel: “S” = 0x53, “a” = 0x61, “A” = 0x41• Klein- und Großbuchstaben liegen auseinan<strong>der</strong> um 0x20 (32).WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 76


Zuordnung von Zeichen zu CodesWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 77


Prozedur- und FunktionsaufrufDefinitionen• Aufrufer: Ursprung des Prozeduraufrufs (hier main)• Aufgerufener: aufgerufene Prozedur (hier sum)Hochsprachevoid main(){int y;y = sum (42, 7);...}int sum (int a, int b){return (a + b);}WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 78


Prozedur- und FunktionsaufrufAufrufkonventionen:• Aufrufer:• Übergibt Argumente (aktuelle Parameter) an Aufgerufenen• Springt Aufgerufenen an• Aufgerufener:• Führt Prozedur/Funktion aus• Gibt Ergebnis (Rückgabewert) an Aufrufer zurück (für Funktion)• Springt hinter Aufrufstelle zurück• Darf keine Register o<strong>der</strong> Speicherstellen überschreiben, die im Aufrufer genutzt werdenKonventionen für MIPS:• Prozeduraufruf: “jump and link (jal)“• Rücksprung: “jump register (jr)”• Register für Argumente: $a0 - $a3• Register für Ergebnis: $v0WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 79


Prozedur- und FunktionsaufrufHochspracheMIPS Assemblerspracheint main() {simple ();a = b + c;}void simple () {return;}0x00400200 main: jal simple0x00400204 add $s0, $s1, $s2...0x00401020 simple: jr $ravoid bedeutet, dass simple keinen Rückgabewert hat.- also eine Prozedur und keine Funktion istWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 80


Prozedur- und FunktionsaufrufHochspracheMIPS Assemblerspracheint main() {simple();a = b + c;}void simple() {return;}0x00400200 main: jal simple0x00400204 add $s0, $s1, $s2...0x00401020 simple: jr $rajal:springt zu simplespeichert PC+4 im Spezialregister $ra “return address register”Hier: $ra = 0x00400204 nach Ausführung von jaljr $ra: springt zur Adresse in $ra, hier also 0x00400204.WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 81


Aufrufargumente und RückgabewertMIPS Konventionen:• Argumentwerte (aktuelle Parameter): $a0 - $a3• Rückgabewert (Funktionswert, Ergebnis): $v0WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 82


Aufrufargumente und RückgabewertHochspracheint main(){int y;...y = diffofsums (2, 3, 4, 5); // 4 Argumente, aktuelle Parameter...}int diffofsums (int f, int g, int h, int i) // 4 formale Parameter{int result;result = (f + g) - (h + i);return result;// Rückgabewert}WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 83


Aufrufargumente und RückgabewertMIPS Assemblersprache# $s0 = ymain:...addi $a0, $0, 2 # Argument 0 = 2addi $a1, $0, 3 # Argument 1 = 3addi $a2, $0, 4 # Argument 2 = 4addi $a3, $0, 5 # Argument 3 = 5jal diffofsums # Prozeduraufrufadd $s0, $v0, $0 # y = Rückgabewert...# $s0 = Rückgabewertdiffofsums:add $t0, $a0, $a1 # $t0 = f + gadd $t1, $a2, $a3 # $t1 = h + isub $s0, $t0, $t1 # result = (f + g) - (h + i)add $v0, $s0, $0 # Lege Rückgabewert in $v0 abjr $ra# Rücksprung zum AufruferWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 84


Aufrufargumente und RückgabewertMIPS Assemblersprache# $s0 = resultdiffofsums:add $t0, $a0, $a1 # $t0 = f + gadd $t1, $a2, $a3 # $t1 = h + isub $s0, $t0, $t1 # result = (f + g) - (h + i)add $v0, $s0, $0 # Lege Rückgabewert in $v0 abjr $ra# Rücksprung zum Aufrufer• diffofsums überschreibt drei Register: $t0, $t1 und $s0•diffofsums kann benötigte Register temporär auf Stack sichernWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 85


Stack (auch Stapel- o<strong>der</strong> Kellerspeicher)• Speicher für temporäres Zwischenspeichernvon Werte• Agiert wie ein Stapel (Beispiel: Teller)• Zuletzt aufgelegter Teller wird zuerstheruntergenommen• “last in, first out” (LIFO)• Dehnt sich aus: Belegt mehr Speicher, wennmehr Daten unterzubringen sind• Zieht sich zusammen: Belegt wenigerSpeicher, wenn zwischengespeicherte Datennicht mehr gebraucht werdenWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 86


Stack• Wächst bei MIPS nach unten (von hohen zu niedrigeren Speicheradressen)• Übliche Realisierung (deshalb auch Kellerspeicher genannt)• Stapelzeiger (“stack pointer”): $sp• zeigt auf zuletzt auf dem Stack abgelegtes DatenelementAdresseDatenAdresseDaten7FFFFFFC 12345678$sp7FFFFFFC123456787FFFFFF87FFFFFF8AABBCCDD7FFFFFF47FFFFFF411223344$sp7FFFFFF07FFFFFF0WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 87


Verwendung des Stacks in Prozeduren• Aufgerufene Prozeduren dürfen keine unbeabsichtigten Nebenwirkungen(“Seiteneffekte”) haben• Problem: diffofsums überschreibt die drei Register $t0, $t1, $s0# MIPS Assemblersprache# $s0 = resultdiffofsums:add $t0, $a0, $a1 # $t0 = f + gadd $t1, $a2, $a3 # $t1 = h + isub $s0, $t0, $t1 # result = (f + g) - (h + i)add $v0, $s0, $0 # Lege Rückgabewert in $v0 abjr $ra# Rücksprung zum AufruferWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 88


Register auf Stack zwischenspeichern# $s0 = resultdiffofsums:addi $sp, $sp, -12 # 3*4 Bytes auf Stack anfor<strong>der</strong>n# um drei 32b Register zu sichernsw $s0, 8($sp) # speichere $s0 auf Stacksw $t0, 4($sp) # speichere $t0 auf Stacksw $t1, 0($sp) # speichere $t1 auf Stackadd $t0, $a0, $a1 # $t0 = f + gadd $t1, $a2, $a3 # $t1 = h + isub $s0, $t0, $t1 # result = (f + g) - (h + i)add $v0, $s0, $0# Lege Rückgabewert in $v0 ablw $t1, 0($sp) # stelle $t1 wie<strong>der</strong> vom Stack herlw $t0, 4($sp) # stelle $t0 wie<strong>der</strong> vom Stack herlw $s0, 8($sp) # stelle $s0 wie<strong>der</strong> vom Stack heraddi $sp, $sp, 12 # Platz auf Stack wird nicht mehr benötigt,# wie<strong>der</strong> freigebenjr $ra # Rücksprung zum AufruferWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 89


Stack FrameVerän<strong>der</strong>ung des Stacks während diffofsumsAdresseDatenAdresseDatenAdresseDatenFC?$spFC? FC ?$spF8F8$s0F8F4F4$t0F4F0F0$t1$spF0(a)(b)(c)WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 90


Sicherungskonventionen für RegisterErhaltenGesichert vom AufgerufenenNicht erhaltenGesichert vom Aufrufer$s0 - $s7 $t0 - $t9$ra $a0 - $a3$sp $v0 - $v1Stack oberhalb von $spStack unterhalb von $spWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 91


Mehrfache Prozeduraufrufe: Sichern von $raproc1:addi $sp, $sp, -4 # Platz auf Stack anlegensw $ra, 0($sp) # sichere $ra auf Stackjal proc2...lw $ra, 0($sp) # stelle $ra vom Stack wie<strong>der</strong> heraddi $sp, $sp, 4 # Stapelspeicher wie<strong>der</strong> freigebenjr $ra# Rückkehr zum Aufrufer von proc1WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 92


Erhalten von Registern mittels Stack# $s0 = resultdiffofsums:addi $sp, $sp, -4 # Platz auf Stack für 4 Bytes anlegen# reicht zum Sichern eines Registerssw $s0, 0($sp) # sichere $s0 auf Stack# $t0 und $t1 brauchen nicht erhalten zu werden!add $t0, $a0, $a1 # $t0 = f + gadd $t1, $a2, $a3 # $t1 = h + isub $s0, $t0, $t1 # result = (f + g) - (h + i)add $v0, $s0, $0 # Lege Rückgabewert in $v0 ablw $s0, 0($sp) # stelle $s0 vom Stack wie<strong>der</strong> heraddi $sp, $sp, 4 # Gebe nicht mehr benötigten Speicher auf Stack freijr $ra# Rücksprung zum AufruferWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 93


Rekursive ProzeduraufrufeHochspracheint fakultaet (int n) {if (n


Rekursive ProzeduraufrufeMIPS AssemblerspracheWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 95


Rekursive ProzeduraufrufeMIPS Assemblersprache0x90 fakultaet: addi $sp, $sp, -8 # Platz für zwei Register0x94 sw $a0, 4($sp) # sichere $a00x98 sw $ra, 0($sp) # sichere $ra0x9C addi $t0, $0, 20xA0 slt $t0, $a0, $t0 # a


Verän<strong>der</strong>ung des Stacks bei rekursivem AufrufAdresseDatenAdresseDatenAdresseDatenFC$spFC$spFC$sp$v0 = 6F8F4F0F8F4F0$a0 (0x3)$ra$a0 (0x2)$spF8F4F0$a0 (0x3)$ra$a0 (0x2)$sp$a0 = 3$v0 = 3 x 2ECE8E4E0ECE8E4E0$ra (0xBC)$a0 (0x1)$ra (0xBC)$sp$spECE8E4E0$ra (0xBC)$a0 (0x1)$ra (0xBC)$sp$sp$a0 = 2$v0 = 2 x 1$a0 = 1$v0 = 1 x 1DCDCDCWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 97


Zusammenfassung: Prozeduraufruf• Aufrufer• Lege Aufrufparameter (aktuelle Parameter) in $a0-$a3 ab• Sichere zusätzlich benötigte Register auf Stack ($ra, manchmal auch $t0-t9)• Entsprechend Konvention über Erhaltung von Registern• jal aufgerufener• Stelle gesicherte Register wie<strong>der</strong> her• Hole evtl. Rückgabewert aus $v0 (bei Funktionen)• Aufgerufener• Sichere zu erhaltende verwendete Register auf Stack (üblicherweise $s0-$s7)• Führe Berechnungen <strong>der</strong> Prozedur aus• Lege Rückgabewert in ab $v0 (bei Funktionen)• Stelle gesicherte Register wie<strong>der</strong> her• jr $raWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 98


AdressierungsartenWo kommen Operanden für Befehle her?• Aus einem Register• Direktwert aus Instruktion• Relativ zu einer Basisadresse• Son<strong>der</strong>fall: Relativ zum Programmzähler• PseudodirektWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 99


AdressierungsartenAus Register (register operands)• Beispiel: add $s0, $t2, $t3• Beispiel: sub $t8, $s1, $0Direktwert aus Instruktion (immediate)• 16b Direktwert als Operand verwenden• Beispiel: addi $s4, $t5, -73• Beispiel:: ori $t3, $t7, 0xFFWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 100


AdressierungsartenRelativ zu einer Basisadresse• Adresse eines Operanden im Speicher ist:Basisadresse + Vorzeichenerweiterter Direktwert• Beispiel: lw $s4, 72($0)• Adresse = $0 + 72• Beispiel: sw $t2, -25($t1)• Adresse = $t1 - 25WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 101


AdressierungsartenRelativ zur nächsten Adresse im Programmzähler0x10 beq $t0, $0, else0x14 addi $v0, $0, 10x18 addi $sp, $sp, i0x1C jr $ra0x20 else: addi $a0, $a0, -10x24 jal fakultaetAssemblersprachebeq $t0, $0, else(beq $t0, $0, 3)op rs rt immBitfel<strong>der</strong> in Instruktion4 8 0 36 bits 5 bits 5 bits 5 bits 5 bits 6 bitsWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 102


AdressierungsartenPseudodirekte OperandenAuffüllen von entfallenen Bits (mit Nullen und PC+4[31:28])0x0040005C jal sum...0x004000A0 sum: add $v0, $a0, $a132b Sprungzieladresse JTA26b Feld in J-Instruktion 26-bit addr0000 0000 0100 0000 0000 0000 1010 00000000 0000 0100 0000 0000 0000 1010 00000 1 0 0 0 2 8(0x004000A0)(0x0100028)Bitfel<strong>der</strong> Field in Instruktion ValuesMaschinencodeMachine Codeopimmopaddr3 0x01000286 bits 26 bits000011 00 0001 0000 0000 0000 0010 10006 bits 26 bits(0x0C100028)WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 103


Compilieren und Ausführen einer AnwendungHochspracheCompilerAssemblerspracheAssemblerObjektdateiObjektdateienBibliotheksdateienLinkerAusführbare DateiLoa<strong>der</strong>SpeicherWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 104


Grace Hopper, 1906 - 1992• Promovierte zum Dr. <strong>der</strong> Mathematik in Yale• Entwickelte den ersten Compiler• Half bei <strong>der</strong> Entwicklung von COBOL• Prägte den Begriff „Debugging“• Elektromechanischer Harvard Mark-I Computer• Hochdekorierte MarineoffizierinWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 105


Was muss im Speicher abgelegt werden?• Instruktionen (historisch auch genannt Text)• Daten• Globale und statische: angelegt vor Beginn <strong>der</strong> Programmausführung• Dynamisch: während <strong>der</strong> Programmausführung angelegt• Speicherobergrenze bei MIPS (-32)?• Maximal 2 32 = 4 Gigabytes (4 GB)• Von Adresse 0x00000000 bis 0xFFFFFFFFWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 106


MIPS Speicherorganisation (memory map)Adresse0xFFFFFFFCSegmentReserviert0x800000000x7FFFFFFCStackDynamische Daten0x100100000x1000FFFCHeapStatische Daten0x100000000x0FFFFFFCText0x004000000x003FFFFCReserviert0x00000000WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 107


Beispielprogramm in “C”int f, g, y; // globale Variablenint main(void){f = 2;g = 3;y = sum(f, g);}return y;int sum(int a, int b) {}return (a + b);WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 108


Beispielprogramm: MIPS Assemblerspracheint f, g, y; // globale Variablenint main(void){}f = 2;g = 3;y = sum(f, g);return y;int sum(int a, int b) {return (a + b);}.dataf: .space 4 # Direktiven für Assemblerg: .space 4 # jeweils ein Wort, initialisierty: .space 4 # auf den Wert 0.textmain:addi $sp, $sp, -4 # Stack Frame anlegensw $ra, 0($sp) # sichere $raaddi $a0, $0, 2 # $a0 = 2sw $a0, f # f = 2addi $a1, $0, 3 # $a1 = 3sw $a1, g # g = 3jal sum# Aufruf von sumsw $v0, y # y = sum()lw $ra, 0($sp) # stelle $ra wie<strong>der</strong> heraddi $sp, $sp, 4 # stelle $sp wie<strong>der</strong> herjr $ra # Rückkehr ins Betriebssystemsum:add $v0, $a0, $a1 # $v0 = a + bjr $ra # returnWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 109


Beispielprogramm: SymboltabelleSymbolAdresseWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 110


Beispielprogramm: SymboltabelleSymbolAdressefgymainsum0x100000000x100000040x100000080x004000000x0040002CWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 111


Beispielprogramm: Ausführbare DateiDateikopf Text Größe Daten GrößeTextsegmentDatensegment0x34 (52 bytes)Adresse0x004000000x004000040x004000080x0040000C0x004000100x004000140x004000180x0040001C0x004000200x004000240x004000280x0040002C0x00400030Adresse0x100000000x100000040x100000080xC (12 bytes)Instruktion0x23BDFFFC0xAFBF00000x200400020xAF8480000x200500030xAF8580040x0C10000B0xAF8280080x8FBF00000x23BD00040x03E000080x008510200x03E0008Datum000addi $sp, $sp, -4sw $ra, 0 ($sp)addi $a0, $0, 2sw $a0, 0x8000 ($gp)addi $a1, $0, 3sw $a1, 0x8004 ($gp)jal 0x0040002Csw $v0, 0x8008 ($gp)lw $ra, 0 ($sp)addi $sp, $sp, -4jr $raadd $v0, $a0, $a1jr $rafgyWS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 112


Beispielprogramm im SpeicherAdresseSpeicher0x7FFFFFFCReserviertStack$sp = 0x7FFFFFFC0x10010000Heap$gp = 0x100080000x10000000ygf0x004000000x03E000080x008510200x03E000080x23BD00040x8FBF00000xAF8280080x0C10000B0xAF8580040x200500030xAF8480000x200400020xAFBF00000x23BDFFFCReserviertPC = 0x00400000WS 10/11 | <strong>Technische</strong> <strong>Grundlagen</strong> <strong>der</strong> <strong>Informatik</strong> - <strong>Kapitel</strong> 6 - Prof. Sorin A. Huss | 113

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!