Kap 5. 5 Die Maschinenprogrammebene eines Rechners. int a=1, b=2; a = a+2*b; Höhere Programmiersprache. Assembler und Maschinenprogramm
|
|
- Frieder Schenck
- vor 6 Jahren
- Abrufe
Transkript
1 5 Die Maschinenprogrammebene eines Rechners Höhere Programmiersprache Assembler und Maschinenprogramm Register und Mikroprogramm int a=1, b=2; a = a+2*b; lw $t0, a lw $t1, b add $t0, $t0, $t1 add $t0, $t0, $t1 sw $t0, a Kap 5 Gatter & & & >1 Transistoren
2 Die Maschinenprogrammebene eines Rechners Jörg Roth 271 Wir betrachten die Ebene der Maschinenprogramme am Beispiel des MIPS R2000 Prozessors. Wir behandeln: die Architektur des MIPS-Prozessors, Register, Adressierungsarten; die Befehle des MIPS-Prozessors; Assembler vs. Maschinensprache, Kodierung von Befehlen; die SPIM-Simulationsumgebung für den MIPS-Prozessor; weitere Eigenschaften der Befehle und Programmbeispiele.
3 Die Maschinenprogrammebene eines Rechners Jörg Roth ADie Komponenten des MIPS R2000 Befehlsregister rs rt rd funct shamt Direkter Operand (immediate) Adress-Offset Adresse (address) $31... lesen schreiben Speicher... Auswahl Auswahl Auswahl Quelle Auswahl Ziel (rd) $2 $1 $zero Auswahl 2.Operand (rt) Auswahl 1.Operand (rs) Adresse Offset addieren Ergebnisse MULT, DIV Hi Lo ALU & Shifter Auswahl Funktion (funct) Anzahl Shifting-Schritte (shamt) Auswahl Adress- Quelle O Z N
4 Die Maschinenprogrammebene eines Rechners Jörg Roth 273 Register des MIPS Es gibt 32 interne Register. Zwei Arten der Bezeichnung: Durchnumeriert: $0,... $31 Anhand der Eigenschaft: $zero, $s0,... $s7, $t0,... $t7 Es gibt eine 1-1-Zuordnung zwischen beiden Bezeichnungen, z.b. $0=$zero, $16=$s0, $17=$s1 Die Register haben verschiedene Bedeutungen. Einige davon: $zero: gibt immer die 0 zurück, kann nicht geschrieben werden $s0,... $s7: generelle Register für Zwischenrechungen Zwei weitere Register mit speziellen Funktionen: Hi, Lo Resultate für Multiplikation: (Hi, Lo) = op1 op2 Resultat für die Division: Hi = op1 mod op2, Lo = op1/op2
5 Die Maschinenprogrammebene eines Rechners Jörg Roth 274 Übersicht der Register: Register Symbolisch Bedeutung $0 $zero immer 0 $1 $at verwendet Assembler bei Pseudobefehlen $2 $3 $v0 $v1 Rückgabewerte von Unterprogrammen $4 $7 $a0 $a3 Parameter für Unterprogr. (Unterprogr. darf verändern) $8 $15 $t0 $t7 Register, die ein Unterprogramm nicht sichern muss $16 $23 $s0 $s7 Register, die ein Unterprogramm sichern muss $24 $25 $t8 $t9 Register, die ein Unterprogramm nicht sichern muss $26 $27 $k0 $k1 reserviert für das Betriebssystem (Interrupts) $28 $gp Zeiger auf globalen Speicherbereich $29 $sp Stackpointer (zum Retten von Registern in Unterprog.) $30 $s8/$fp Framepointer ($sp beim Start eines Unterprogramms) $31 $ra Rücksprungadresse für Unterprogramme
6 Die Maschinenprogrammebene eines Rechners Jörg Roth 275 Bemerkungen zu den Registern: Die Bedeutung der Register außer $zero und $ra ist nur eine Konvention. Logische und arithmetische Operationen sowie Shift-Funktionen werden nur auf den Registern durchgeführt, nicht auf Speicheradressen. Beispiel: add $s1, $s2, $s3 bedeutet $s1 := $s2 + $s3 Um Operationen auf Speicherinhalten durchzuführen, müssen zuerst die Inhalte in Register geladen werden und am Ende das Resultat gespeichert werden: lw $s2,1000 # Lade Inhalt von Adresse 1000 in $s2 lw $s3,2000 # Lade Inhalt von Adresse 2000 in $s3 add $s1, $s2, $s3 # Addiere sw $s1, 3000 # Speichere Resultat in Adresse 3000
7 Die Maschinenprogrammebene eines Rechners Jörg Roth BMaschinensprache und Assembler Die vom Prozessor ausführbaren Befehle liegen im Binärformat vor. Nur solche Befehle sind direkt ausführbar. So steht das Wort ( ) 16 für den symbolischen Befehl add $17, $18, $19 bzw. add $s1, $s2, $s3 Während der Befehl ( ) 16 für den Prozessor leicht "verständlich" ist, ist er für Menschen schwer lesbar. Für Menschen ist dagegen die Textzeile "add $s1, $s2, $s3" verständlicher. Das "add" im Befehl wird Mnemonic genannt. Die Registerbenennung kann in der gewünschten Form erfolgen. Zusätzlich gibt es syntaktische Kennzeichnungen für verschiedene Adressierungsarten (siehe unten).
8 Die Maschinenprogrammebene eines Rechners Jörg Roth 277 Zur Lösung dieses Problems verwendet man zur Programmierung auf Maschinenebene einen so genannten Assembler: Assembler lesen Texte zeilenweise und wandeln in der Regel jede Textzeile in einen Maschinenbefehl um. Ein typischer Befehl besteht aus einem Mnemonic (z.b. addi) und Operanden (z.b. $s1), letztere durch Kommata oder Blanks getrennt. Die Übersetzung von Assembler-Texten in Maschinenbefehle ähnelt der Compilierung bei höheren Programmiersprachen der Prozess wird Assemblierung genannt. Nicht korrekt geformte Texte können Syntaxfehler enthalten, so dass kein Maschinenprogramm generiert werden kann. Es gibt eine 1-1-Übersetzung von Assembler-Befehlen zu Maschinen- Befehlen man verfügt also bei weitem nicht über die Möglichkeiten einer höheren Programmiersprache.
9 Die Maschinenprogrammebene eines Rechners Jörg Roth 278 Weitere Funktionen eines Assemblers: Hantieren mit symbolischen Adressen: Der Entwickler kann bestimmten Speicheradressen Namen (Label) zuordnen. Der Assembler erkennt diese Namen und fügt bei der Übersetzung die Originaladressen ein. Hantieren mit symbolischen Sprungzielen: Sprungbefehle führen den Programmablauf an einer anderen Stelle des Programms fort. Diese Stellen können symbolisch benannt werden. Bei relativen Sprüngen (z.b. "springe 100 Bytes nach vorne") berechnet der Assembler die Sprungdifferenz anhand des symbolischen Namens automatisch. Komfortables Einfügen statischer Daten: Neben den Maschinenbefehlen enthält ein Programm auch statische Bereiche, z.b. feste Zeichenketten oder numerische Konstanten. Über Assembler-Befehle können solche Datenbereiche komfortabel erstellt werden. Angabe von numerischen Konstanten in verschiedenen Zahlensystemen, z.b. "100" (dezimal) "0xFF" (hexadezimal).
10 Die Maschinenprogrammebene eines Rechners Jörg Roth 279 Pseudobefehle: häufig benutzte Befehle können durch eigene Befehlskürzel abgekürzt werden. So existiert in MIPS der Pseudobefehl li (load immediate), z.b. in li $s1, 100 # Lade die Zahl 100 in das Register $s1 der allerdings bei der Assemblierung in den Befehl ori $s1, $zero, 100 # $s1 := 0 OR 100 übersetzt wird. Der zweite Befehl ist inhaltsgleich aber für Menschen schwerer lesbar. Makros sind mehrzeilige Befehlssequenzen, die bei der Assemblierung textuell eingefügt werden. Das kann die Lesbarkeit erhöhen. Markos können auch parametrisiert werden, dürfen aber nicht mit Unterprogrammen verwechselt werden, da sie zur Assemblierzeit textuell eingefügt werden und keine Verwaltung zur Laufzeit erfordern.
11 Die Maschinenprogrammebene eines Rechners Jörg Roth 280 Ein MIPS-Beispielprogramm:.text # Schlüsselwort für den Anfang des Programmtexts main: # Einstiegspunkt des Programms addi $s1, $zero, 20# Lade 20 in das Register $s1 ($s1 := ) sll $s1, $s1, 3 # Schiebe $s1 um 3 Bit nach links ($s1 := $s1 * 8) addi $s2, $s1, 10 # $s2 := $s1+10 Dieses Programm berechnet 20*8+10 und legt das Ergebnis in $s2 ab. Bemerkung: Dieses Programm soll lediglich die Wirkungsweise von Maschinenbefehlen illustrieren. In der Realität würde man das Ergebnis der Rechnung (170) direkt dem Register $s2 zuweisen.
12 Die Maschinenprogrammebene eines Rechners Jörg Roth CDie MIPS-Befehle Die MIPS-Befehle orientieren sich an folgenden vier Design-Prinzipien: Simplicity favors regularity ("Einfachheit bevorzugt Regelmäßigkeit"): Nur eine Befehlslänge von 32 Bit Nur drei Befehlsformate Innerhalb eines Befehlsformats: feste Anzahl von Operanden Smaller is faster ("Kleiner ist schneller"): Eine kleine Anzahl von Registern begünstigt eine schnelle Befehlsabarbeitung.
13 Die Maschinenprogrammebene eines Rechners Jörg Roth 282 Good design demands compromise ("Gutes Design erfordert einen Kompromiß"): Einiges ist unbequem, z.b. immer exakt drei Operanden für bestimmte Befehle zu haben. Einige wünschenswerte Befehle fehlen, z.b. Register-Kopien. Ein Teil der Unbequemlichkeit wird durch Pseudo-Befehle behoben. Make the common case fast ("Mache den üblichen Fall schnell"): Beispiel der Angabe von Konstanten: Für 16-Bit Konstanten ("der übliche Fall") kann MIPS dies in einem 32-Bit-Befehl ausdrücken. Für größere Konstanten ("der unübliche Fall") erfordert dies 2 Befehle.
14 Die Maschinenprogrammebene eines Rechners Jörg Roth 283 Bezeichnungen: Rd, Rs, Rt: Register $0...$31 bzw. $v0 $v1, $a0 $a3, $t0 $t7 etc. I: Direktoperand (immediate): Operand wird durch 16 Bit gegeben, die auf 32 Bit erweitert werden: Beispiel :1000 stellt den direkten Wert der Zahl 1000 dar. Hi, Lo: Multiplikations-, Divisionsergebnis Label: Sprungziel shamt: Feste Zahl von Schiebeschritten (vergleichbar mit I) Address(Rs): Zugriff auf die Speicherzelle Mem[Address+Rs], Beispiel 1000($s1) für Zugriff auf Mem(1000+$s1) Die Bedeutung der Spalte F (Format) wird weiter unten erklärt.
15 Die Maschinenprogrammebene eines Rechners Jörg Roth 284 Arithmetische Operationen: Befehl Beschreibung Vorzeichen F add Rd, Rs, Rt Rd := Rs + Rt mit R addu Rd, Rs, Rt Rd := Rs + Rt ohne R addi Rt, Rs, I Rt := Rs + I mit I addiu Rt, Rs, I Rt := Rs + I ohne I sub Rd, Rs, Rt Rd := Rs Rt mit R subu Rd, Rs, Rt Rd := Rs Rt ohne R div Rs, Rt Lo := Rs/Rt, Hi := Rs mod Rt mit R divu Rs, Rt Lo := Rs/Rt, Hi := Rs mod Rt ohne R mult Rs, Rt (Hi, Lo) := Rs Rt mit R Hi = oberen 32 Bits, Lo = unteren 32 Bits multu Rs, Rt (Hi, Lo) := Rs Rt Hi = oberen 32 Bits, Lo = unteren 32 Bits ohne R
16 Die Maschinenprogrammebene eines Rechners Jörg Roth 285 Bitweise logische Verknüpfungen: Befehl Beschreibung F and Rd, Rs, Rt Rd := Rs Rt R andi Rt, Rs, I Rt := Rs I I nor Rd, Rs, Rt Rd := Rs Rt R or Rd, Rs, Rt Rd := Rs Rt R ori Rt, Rs, I Rt := Rs I I xor Rd, Rs, Rt Rd := Rs Rt R xori Rt, Rs, I Rt := Rs I I
17 Die Maschinenprogrammebene eines Rechners Jörg Roth 286 Schiebeoperationen: Befehl Beschreibung F sll Rd, Rt, shamt Rd := Rt links-geschoben um shamt Bits R sllv Rd, Rt, Rs Rd := Rt links-geschoben um Rs Bits R srl Rd, Rt, shamt Rd := Rt rechts-geschoben um shamt Bits R srlv Rd, Rt, Rs Rd := Rt rechts-geschoben um Rs Bits R sra Rd, Rt, shamt Rd := Rt rechts-geschoben um shamt Bits R (arithmetisch, d.h. Erhaltung des Vorzeichens) srav Rd, Rt, Rs Rd := Rt rechts-geschoben um Rs Bits (arithmetisch, d.h. Erhaltung des Vorzeichens) R
18 Die Maschinenprogrammebene eines Rechners Jörg Roth 287 Vergleichen von Inhalten: Befehl Beschreibung Vorzeichen F slt Rd, Rs, Rt Rd := 1 wenn Rs < Rt, Rd := 0 wenn Rs Rt sltu Rd, Rs, Rt Rd := 1 wenn Rs < Rt, Rd := 0 wenn Rs Rt slti Rt, Rs, I Rt := 1 wenn Rs < I, Rt := 0 wenn Rs I sltiu Rt, Rs, I Rt := 1 wenn Rs < I, Rt := 0 wenn Rs I mit ohne mit ohne R R I I
19 Die Maschinenprogrammebene eines Rechners Jörg Roth 288 Laden und Speichern: Befehl Beschreibung F mfhi Rd Rd := Hi R mflo Rd Rd := Lo R lui Rt, I Rt := I 2 16 I (oberste 16 Bit = I, unterste 16 Bit = 0) lb Rt, Address(Rs) Rt := Byte in Mem[Address + Rs] I (Vorzeichen auf 32 Bit erweitert) lbu Rt, Address(Rs) Rt := Byte in Mem[Address + Rs] I (keine Vorzeichenerweiterung) sb Rt, Address(Rs) Byte in Mem[Address + Rs] := Rt I lw Rt, Address(Rs) Rt := Word in Mem[Address + Rs] I sw Rt, Address(Rs) Word in Mem[Address + Rs] := Rt I
20 Die Maschinenprogrammebene eines Rechners Jörg Roth 289 Relative Sprünge (Branch): Befehl Beschreibung Vorzeichen F beq Rs, Rt, Label Springe wenn Rs =Rt egal I bne Rs, Rt, Label Springe wenn Rs Rt egal I bgez Rs, Label Springe wenn Rs 0 mit I bgtz Rs, Label Springe wenn Rs > 0 mit I blez Rs, Label Springe wenn Rs 0 mit I bltz Rs, Label Springe wenn Rs < 0 mit I
21 Die Maschinenprogrammebene eines Rechners Jörg Roth 290 Absolute Sprünge (Jump): Befehl Beschreibung F j Label Springe J jal Label Unterprogrammaufruf J jr Rs Springe zur Adresse in Rs R jalr Rs Unterprogrammaufruf zur Adresse in Rs R Sonstige Befehle: Befehl Beschreibung F syscall Betriebssystemaufruf R break n Exception n aufrufen R
22 Die Maschinenprogrammebene eines Rechners Jörg Roth 291 Die wichtigsten Pseudobefehle: Befehl li Rd, I la Rd, Label move Rd, Rs Beschreibung Rd := I Rd := Adresse des Labels (Achtung: nicht den Inhalt der Speicherzelle kopieren, sondern die Adresse der Speicherzelle) Rd := Rs
23 Die Maschinenprogrammebene eines Rechners Jörg Roth 292 Adressierungsarten: Durch den Befehl wird die jeweilige Adressierungsart festgelegt, also die Art, wie auf einen Operanden zugegriffen wird, z.b. add: Registeradressierung addi: Direktoperand Nicht bei jeder Assemblersprache ist das so. Bei einigen Assemblersprachen gibt es ein einziges Mnemonic für verschiedene Adressierungsarten. Der Assembler erkennt dann syntaktisch die jeweilige Variante und fügt automatisch die verschiedenen Binärbefehle ein. Beispiel Z80-Assembler ADD A, B # Addiere A := A + B (A, B sind CPU-Register) ADD A, 100 # Addiere A := A (addiere Direktoperand 100) ADD A, (HL) # Addiere A := A + Mem(HL) (HL ist ein Zeigerregister)
24 Die Maschinenprogrammebene eines Rechners Jörg Roth 293 Adressierungsarten des MIPS: Direktwert (immediate): eine Zahl i, die direkt im Befehl steht Register: ein Register, darstellt durch eine Registernummer r, z.b. r =17 für $s1 Speicher: Speicherinhalt einer Adresse a: Mem[a] Register-indirekt: eine Registernummer r definiert ein Register, das als Zeiger auf eine Speicheradresse benutzt wird: Mem[$r] Register-indirekt mit Versatz: eine Registernummer r definiert eine Zeigerregister, zu dem eine Adresse a hinzuaddiert wird: Mem[a + $r] Bemerkung: MIPS stellt die Adressierungsarten Speicher und Registerindirekt immer als Register-indirekt mit Versatz dar: Speicher: Mem[a + $zero] Register-indirekt: Mem[0 + $r]
25 Die Maschinenprogrammebene eines Rechners Jörg Roth DKodierung von MIPS-Befehlen Es gibt drei Formate (siehe Spalte F in den Befehlstabellen) Jeder Befehl ist 32 Bit lang R-Format 6 Bit 5 Bit 5 Bit 5 Bit 5 Bit 6 Bit op rs rt rd shamt funct I-Format 6 Bit 5 Bit 5 Bit 16 Bit op rs rt address/immediate J-Format 6 Bit 26 Bit op address
26 Die Maschinenprogrammebene eines Rechners Jörg Roth 295 Anhand des Feldes op wird erkannt, welches Format verwendet wird R-Format: op = (000000) I-Format: alle op außer op = (000000), op = (00001*), op = (0100**) J-Format: op = (00001*) Ein weiteres Format ist für Co-Prozessor-Befehle reserviert (hier nicht behandelt): op = (0100**) Bedeutung der Felder: op, funct: op spezifiziert den Befehl (Opcode). Bei op = 0 wird funct hinzugenommen, um den Befehl zu identifizieren rs, rt, rd: Register: rs: 1. Operand (source), rt: 2. Operand bzw. Zielregister (target), rd: Zielregister (destination) shamt: Zahl von Schiebeschritten address/immediate: relative Sprungadresse oder 16-Bit Direktoperand address: Absolute Sprungadresse
27 Die Maschinenprogrammebene eines Rechners Jörg Roth 296 R-Format-Befehle: Befehl op rs rt rd shamt funct add Rd, Rs, Rt 0 rs rt rd 0 32 addu Rd, Rs, Rt 0 rs rt rd 0 33 sub Rd, Rs, Rt 0 rs rt rd 0 34 subu Rd, Rs, Rt 0 rs rt rd 0 35 div Rs, Rt 0 rs rt divu Rs, Rt 0 rs rt mult Rs, Rt 0 rs rt multu Rs, Rt 0 rs rt and Rd, Rs, Rt 0 rs rt rd 0 36 nor Rd, Rs, Rt 0 rs rt rd 0 39 or Rd, Rs, Rt 0 rs rt rd 0 37
28 Die Maschinenprogrammebene eines Rechners Jörg Roth 297 Befehl op rs rt rd shamt funct xor Rd, Rs, Rt 0 rs rt rd 0 38 sll Rd, Rt, shamt 0 0 rt rd shamt 0 sllv Rd, Rt, Rs 0 rs rt rd 0 4 srl Rd, Rt, shamt 0 0 rt rd shamt 2 srlv Rd, Rt, Rs 0 rs rt rd 0 6 sra Rd, Rt, shamt 0 0 rt rd shamt 3 srav Rd, Rt, Rs 0 rs rt rd 0 7 mfhi Rd rd 0 16 mflo Rd rd 0 18 slt Rd, Rs, Rt 0 rs rt rd 0 42 sltu Rd, Rs, Rt 0 rs rt rd 0 43 jr Rs 0 rs jalr Rs 0 rs
29 Die Maschinenprogrammebene eines Rechners Jörg Roth 298 Befehl op rs rt rd shamt funct syscall break n n 13
30 Die Maschinenprogrammebene eines Rechners Jörg Roth 299 I-Format-Befehle: Befehl op rs rt address/immediate addi Rt, Rs, I 8 rs rt immediate addiu Rt, Rs, I 9 rs rt immediate andi Rt, Rs, I 12 rs rt immediate ori Rt, Rs, I 13 rs rt immediate xori Rt, Rs, I 14 rs rt immediate lui Rt, I 15 0 rt immediate lb Rt, Address(Rs) 32 rs rt address lbu Rt, Address(Rs) 36 rs rt address sb Rt, Address(Rs) 40 rs rt address lw Rt, Address(Rs) 35 rs rt address sw Rt, Address(Rs) 43 rs rt address
31 Die Maschinenprogrammebene eines Rechners Jörg Roth 300 Befehl op rs rt address/immediate slti Rt, Rs, I 10 rs rt immediate sltiu Rt, Rs, I 11 rs rt immediate beq Rs, Rt, Label 4 rs rt address bne Rs, Rt, Label 5 rs rt address bgez Rs, Label 1 rs 1 address bgtz Rs, Label 7 rs 0 address blez Rs, Label 6 rs 0 address bltz Rs, Label 1 rs 0 address J-Format-Befehle: Befehl op address j Label 2 address jal Label 3 address
32 Die Maschinenprogrammebene eines Rechners Jörg Roth 301 Beispiel: Übersetzen des Beispielprogramms in Maschinensprache Befehlszeile F op rs rt rd shamt funct addi $s1,$zero,20 I sll $s1,$s1,3 R addi $s2,$s1,10 I adr/ imm Maschinenbefehl (Hex) C A
33 Die Maschinenprogrammebene eines Rechners Jörg Roth E Die SPIM-Umgebung SPIM ist ein Simulationswerkzeug für MIPS-Prozessoren Es enthält einen Assembler und eine Laufzeitumgebung Da das Wirtsystem (z.b. Windows) auf einem anderen Prozessor basiert, werden die MIPS-Maschinenbefehle zur Laufzeit auf einem virtuellen Prozessor simuliert.
34 Die Maschinenprogrammebene eines Rechners Jörg Roth 303 SPIM-Funktionen: Anzeigen von Register- und Speicherinhalten Zeigen des assemblierten Programms Durchlaufen des Codes im Einzelschrittmodus Setzen von Break-Points Über syscall kann aus dem Maschinenprogramm heraus eine rudimentäre Konsole angesprochen werden Ein/Ausgabe von Zahlen Ein/Ausgaben von Zeichenketten
35 Die Maschinenprogrammebene eines Rechners Jörg Roth 304 Direktiven des SPIM-Assemblers an einem Beispiel:.data # Schlüsselwort für den statischen Datenteil label1:.word 1000 # Anlegen des 32-Bit-Wortes mit dem Wert 1000 label2:.byte 10 # Anlegen des Bytes mit dem Wert 10 label3:.byte a # Anlegen des Bytes mit dem ASCII-Wert für a label3:.space 15 # Anlegen von 15 Bytes mit dem Wert 0 label4:.asciiz "Dies ist ein Text" # Anlegen eines 0-terminierten Strings.text # Schlüsselwort für den Programmtext main: addi... # Ein Programm muss diesen Einstiegspunkt haben # Ab hier stehen die Assemblerbefehle
36 Die Maschinenprogrammebene eines Rechners Jörg Roth 305 Die wichtigsten SPIM syscalls Nr. $v0 Beschreibung 1 32-Bit-Zahl dezimal auf die Konsole ausgeben 4 0-terminierten String auf die Konsole ausgeben 5 32-Bit-Zahl dezimal von der Konsole einlesen 8 String von der Konsole einlesen und 0-terminiert in Puffer ablegen Aufrufargument Rückgabewert $a0 = Wert der Zahl $a0 = Adresse des Strings $v0 = Wert der Zahl $a0 = Adresse des Stringpuffers $a1 = Länge des Stringpuffers 9 Dynamischen Speicher allozieren $a0 = Länge des Blocks $v0 = Adresse des Blocks 10 Programm beenden
37 Die Maschinenprogrammebene eines Rechners Jörg Roth 306 Bemerkungen zu den SPIM syscalls: Ein Programm terminiert automatisch nach der letzten Befehlszeile. syscall 10 wird nur benötigt, wenn man das Programm vorher beenden möchte. Alternativ kann man hinter den letzten Befehl springen. Die syscalls zur Zahlen-Ein/Ausgabe verwenden Register für die Zahlenspeicherung. Die syscalls zu der String-Ein/Ausgabe legen die Zeichenketten im Speicher ab (nicht in den Registern). Über das Register $a0 wird die Adresse des Strings bzw. des freien Stringpuffers angegeben.
38 Die Maschinenprogrammebene eines Rechners Jörg Roth 307 Beispiel:.data prompt:.asciiz "Bitte Zahl eingeben: " text1:.asciiz "Sie haben die Zahl " text2:.asciiz " eingegeben\n".text main: li $v0, 4 la $a0,prompt syscall li $v0, 5 syscall or $s0, $zero, $v0 # String ausgeben # "Bitte Zahl eingeben: # Zahl einlesen # $s0 := Eingabe;
39 Die Maschinenprogrammebene eines Rechners Jörg Roth 308 li $v0, 4 # String ausgeben la $a0,text1 # "Sie haben die Zahl " syscall li $v0, 1 or $a0, $zero, $s0 syscall li $v0, 4 la $a0,text2 syscall li $v0, 10 syscall # Resultat ausgeben # in $s0 stand die Zahl # String ausgeben # " eingegeben\n" # Programm beenden
40 Die Maschinenprogrammebene eines Rechners Jörg Roth F Die Maschinenbefehle im Detail 5.F.a Arithmetische Operationen Addition und Subtraktion: Befehl Beschreibung Vorzeichen add Rd, Rs, Rt Rd := Rs + Rt mit addu Rd, Rs, Rt Rd := Rs + Rt ohne addi Rt, Rs, I Rt := Rs + I mit addiu Rt, Rs, I Rt := Rs + I ohne sub Rd, Rs, Rt Rd := Rs Rt mit subu Rd, Rs, Rt Rd := Rs Rt ohne
41 Die Maschinenprogrammebene eines Rechners Jörg Roth 310 Bemerkungen: Zahlendarstellung: 32 Bit-Zweierkomplement Es gibt kein subi und subiu. Stattdessen verwendet man addi und addiu und muss den immediate-operanden von Hand negieren. Z.B. addi $s0, $s0, -1 um 1 von $s0 abzuziehen add und addu addieren intern identisch. add erzeugt aber eine Exception, wenn das Resultat das falsche Vorzeichen erhält (Overflow-Bedingung). addu produziert keine Exception, auch wenn ein Übertrag generiert wird.
42 Die Maschinenprogrammebene eines Rechners Jörg Roth 311 Beispiele: li $s0, # = 2^31-1 addiu $s1, $s0, 1 # bei unsigned addition Resultat: $s1= li $s0, addi $s1, $s0, 1 Resultat: Arithmetic Overflow # maximale positive Zahl # Resultat bekommt falsches Vorzeichen li $s0, # maximale 32-Bit-Zahl addiu $s1, $s0, 1 # Übertrag wird ignoriert Resultat: $s1=0 (Bemerkung: würde auch bei addi entstehen)
43 Die Maschinenprogrammebene eines Rechners Jörg Roth 312 Multiplikation und Division: Befehl Beschreibung Vorzeichen div Rs, Rt Lo := Rs/Rt, Hi := Rs mod Rt mit divu Rs, Rt Lo := Rs/Rt, Hi := Rs mod Rt ohne mult Rs, Rt (Hi, Lo) := Rs Rt mit Hi = oberen 32 Bits, Lo = unteren 32 Bits multu Rs, Rt (Hi, Lo) := Rs Rt Hi = oberen 32 Bits, Lo = unteren 32 Bits ohne Bemerkungen: Es gibt keine Mult-, Div-Befehle mit immediate-operand. Das Ergebnis einer 32-Bit-Multiplikation benötigt 64 Bit. Daher existieren zwei 32-Bit-Register Hi und Lo, die die Resultate aufnehmen. Diese Register können nicht explizit beschrieben werden.
44 Die Maschinenprogrammebene eines Rechners Jörg Roth 313 multu behandelt die Operanden als vorzeichenlose Zahlen, mult als Vorzeichenzahlen. Es kann kein Überlauf oder Übertrag produziert werden, also auch keine Exceptions. Im Ggs. zu add/addu werden intern unterschiedliche Operationen durchgeführt, je nachdem ob man Vorzeichenzahlen oder vorzeichenlose Zahlen verwendet. Beispiel: li $s0, # 2^32-1 entspricht -1 li $s1, # 2^32-1 entspricht -1 mult $s0, $s1 Resultat (Hi, Lo) = 1 li $s0, li $s1, # 2^32-1 (max. 32-Bit-Zahl) # 2^32-1 (max. 32-Bit-Zahl) multu $s0, $s1 Resultat (Hi, Lo) =
45 Die Maschinenprogrammebene eines Rechners Jörg Roth F.bLogische Operationen Bitweise logische Verknüpfungen Befehl and Rd, Rs, Rt andi Rt, Rs, I nor Rd, Rs, Rt or Rd, Rs, Rt ori Rt, Rs, I xor Rd, Rs, Rt xori Rt, Rs, I Beschreibung Rd := Rs Rt Rt := Rs I Rd := Rs Rt Rd := Rs Rt Rt := Rs I Rd := Rs Rt Rt := Rs I
46 Die Maschinenprogrammebene eines Rechners Jörg Roth 315 Illustration am Beispiel des and-befehls: rs... rt... & & & & rd... Bemerkungen: Es gibt keinen immediate Befehl für nor. Es gibt keine Befehle für nand und xnor.
47 Die Maschinenprogrammebene eines Rechners Jörg Roth 316 Möglichkeiten für das Komplementieren von Bits: Beispiel: $s1 := $s0 nor $s1, $s0, $s0 xori $s1, $s0, -1 # -1 = FFFF FFFF, Achtung: nur 16 Bit komplementiert Bemerkungen: Der "native" xori-befehl verwendet (wie alle immediate-befehle) nur 16- Bit-Immediate-Operanden. Damit werden nur die unteren 16 Bit komplementiert. Verwendet man xori mit einem Operanden mit mehr als 16 Bit, so erkennt der Assembler das und verwendet automatisch einen Pseudobefehl: Laden der oberen 16 Bit in das $at-register (Befehl lui) Laden der unteren 16 Bit in das $at-register (Befehl ori) Verwenden der xor-operation (nicht xori) mit Register $at
48 Die Maschinenprogrammebene eines Rechners Jörg Roth 317 Wozu benötigt man bitweise logische Verknüpfungen? Beispiel Mauszeiger: Maske: alle Bits des Bildschirms müssen auf 0 gesetzt werden Zeigerbits Maskenbits Mauszeiger: alle Bits des Bildschirms müssen auf 1 gesetzt werden Bildschirm Bildschirm UND Maske Bildschirm UND Maske ODER Maus
49 Die Maschinenprogrammebene eines Rechners Jörg Roth 318 Das zugehörige Programm: Die 64 Zeigerbits seien in $s0, $s1 gespeichert Die 64 Maskenbits seien in $s2, $s3 gespeichert Die 64 Bildschirmbits unter dem Zeiger seien schon aus dem Bildspeicher in $s4, $s5 abgelegt nor $s2, $s2, $s2 # Maskenbits invertieren nor $s3, $s3, $s3 and $s4, $s4, $s2 # Bildschirm UND Komplement der Maske and $s5, $s5, $s3 # d.h. alle Bild-Bits außerhalb der Maske =0 or $s4,$s4, $s0 # Resultat ODER Mauszeiger or $s5,$s5, $s1 # damit werden alle Bild-Bits des Zeigers =1
50 Die Maschinenprogrammebene eines Rechners Jörg Roth 319 Schiebeoperationen: Befehl Beschreibung sll Rd, Rt, shamt Rd := Rt links-geschoben um shamt Bits sllv Rd, Rt, Rs Rd := Rt links-geschoben um Rs Bits srl Rd, Rt, shamt Rd := Rt rechts-geschoben um shamt Bits srlv Rd, Rt, Rs Rd := Rt rechts-geschoben um Rs Bits sra Rd, Rt, shamt Rd := Rt rechts-geschoben um shamt Bits (arithmetisch, d.h. Erhaltung des Vorzeichens) srav Rd, Rt, Rs Rd := Rt rechts-geschoben um Rs Bits (arithmetisch, d.h. Erhaltung des Vorzeichens)
51 Die Maschinenprogrammebene eines Rechners Jörg Roth 320 Illustration der Schiebeoperationen mit shamt=1 sll srl rt... rt... rd rd... sra rt... rd... Verwendung der Schiebebefehle: Operanden multiplizieren mit 2 shamt, dividieren durch 2 shamt Umwandlung serielle Daten parallele und umgekehrt Zugriff auf Inhalte "gepackter" Strukturen
52 Die Maschinenprogrammebene eines Rechners Jörg Roth 321 Beispiel: Pixel-Information eines High-Color-Bildes (16 Bit/Pixel): Jeder Pixel enthält folgende Informationen: 5 Bit-Wert für "rot" 6 Bit-Wert für "grün" 5 Bit-Wert für "blau" rot grün blau (Es gibt eine Reihe weiterer Möglichkeiten, z.b. True-Color mit 32 Bit)
53 Die Maschinenprogrammebene eines Rechners Jörg Roth 322 Das zugehörige Programm: Der Pixelwert sei schon in $s0 Wir wollen rot in $t0, grün in $t1 und blau in $t2 speichern srl $t0, $s0, 11 andi $t1, $s0, 0x07e0 srl $t1, $t1, 5 andi $t2, $s0, 0x001f # oberen 5 Bits (rot) nach rechts schieben # mittleren 6 Bits (grün) herauskopieren # und nach rechts schieben # unteren 5 Bits (blau) herauskopieren
54 Die Maschinenprogrammebene eines Rechners Jörg Roth F.c Vergleiche Befehl Beschreibung Vorzeichen slt Rd, Rs, Rt Rd := 1 wenn Rs < Rt, Rd := 0 wenn Rs Rt sltu Rd, Rs, Rt Rd := 1 wenn Rs < Rt, Rd := 0 wenn Rs Rt slti Rt, Rs, I Rt := 1 wenn Rs < I, Rt := 0 wenn Rs I sltiu Rt, Rs, I Rt := 1 wenn Rs < I, Rt := 0 wenn Rs I mit ohne mit ohne
55 Die Maschinenprogrammebene eines Rechners Jörg Roth 324 Motivation für die slt-befehle: Es gibt (siehe weiter unten) keine bedingten Sprünge, die den Größenvergleich zweier Operanden durchführen. Vergleich und Sprung führt man daher so aus: slt $t0, $s0, $s1 # $t0 := 1 wenn $s0 <$s1 bgtz $t0, Label # Springe wenn $t0 > 0 (d.h. $s0 <$s1)
56 Die Maschinenprogrammebene eines Rechners Jörg Roth 325 Weiteres Beispiel: In den Registern $t0, $t1, $t2 sind drei Zahlen abgelegt. Zähle, wie viele dieser drei Zahlen kleiner als 100 sind. Ablage in $s0 slti $s0, $t0, 100 # $s0 := 1 wenn $t0 <100 slti $s1, $t1, 100 # $s1 := 1 wenn $t1 <100 add $s0, $s0, $s1 # $s0 := Summe der ersten beiden Ergebnisse slti $s1, $t2, 100 # $s1 := 1 wenn $t2 <100 add $s0, $s0, $s1 # $s0 := Summe alle Ergebnisse
57 Die Maschinenprogrammebene eines Rechners Jörg Roth 326 Weitere Funktion von sltu: Berechnen des Übertrags In MIPS gibt es kein Carry-Bit, wie in den meisten anderen CPUs. Man erkennt daher nicht auf einfache Weise, ob ein Übertrag bei einer Addition entstanden ist. Berechnung des Carry-Bits in $t0, $t1 seien positive Zahlen gespeichert: addu $t2, $t0, $t1 sltu $t3, $t2, $t1 # Teste, ob die Summe kleiner ist als $t1 Danach: $t2: Summe von $t0, $t1 (mod 2 32 ) $t3: 1, wenn Übertrag aufgetreten ist
58 Die Maschinenprogrammebene eines Rechners Jörg Roth F.d Laden und Speichern Befehl mfhi Rd mflo Rd Rd := Hi Rd := Lo Beschreibung lui Rt, I Rt := I 2 16 (oberste 16 Bit = I, unterste 16 Bit = 0) lb Rt, Address(Rs) Rt := Byte in Mem[Address + Rs] (Vorzeichen auf 32 Bit erweitert) lbu Rt, Address(Rs) Rt := Byte in Mem[Address + Rs] (keine Vorzeichenerweiterung) sb Rt, Address(Rs) Byte in Mem[Address + Rs] := Rt lw Rt, Address(Rs) Rt := Word in Mem[Address + Rs] sw Rt, Address(Rs) Word in Mem[Address + Rs] := Rt
59 Die Maschinenprogrammebene eines Rechners Jörg Roth 328 Bemerkungen: Es gibt keinen nativen Befehl für das Laden von immediate-operanden li ist ein Pseudobefehl, der intern auf ori...,$zero,... abgebildet wird. Um 32-Bit-Konstanten in Register zu kopieren, reichen die 16-Bit in einem Befehl (I-Format) nicht aus. Deshalb gibt es den Befehl lui, der die oberen 16 Bit eines Registers mit dem immediate-operanden füllt. Die untere Hälfte kann dann mit ori... gefüllt werden. lb, lw (bzw. sb, sw) unterscheiden sich in der Bit-Breite des Zugriffs: lb, sb: 8 Bit, lw, sw: 32 Bit Da bei lb nur 8 Bit des 32-Bit-Registers belegt werden, kann man entscheiden, wie die übrigen 24 Bit gesetzt werden: lbu: restliche 24 Bit werden auf 0 gesetzt lb: restliche 24 Bit werden auf Bit 7 (Vorzeichenbit) gesetzt Bei sb werden die Bits 8-31 des Registers beim Speichern ignoriert.
60 Die Maschinenprogrammebene eines Rechners Jörg Roth 329 Die Befehle lb, lbu, lw, sb, sw benutzen die Adressierungsart Registerindirekt mit Versatz. Da der Versatz als immediate-operator definiert wird, kann nur ein Versatz von bis ausgedrückt werden. Daher kann z.b. der Befehl lb $s0, nicht direkt übersetzt werden, da der immediate-operand größer ist als Der Assembler erkennt dies und wertet in diesem Fall lb als Pseudobefehl aus: lui $at, 1 # $at = lb $s0, ($at)# $s0 := Mem[ ] = Mem[50000] Jedes Wort belegt 4 Byte. Die Adressierung basiert auf Bytes. Sollen Worte adressiert werden, die direkt hintereinander im Speicher liegen, muss man die Adresse jeweils um 4 erhöhen.
61 Die Maschinenprogrammebene eines Rechners Jörg Roth 330 Beispiel:.data word1:.word 10 word2:.word 11.text main: la $s0,word1 lw $t0,0($s0) lw $t1,4($s0) # Zwei Worte direkt hintereinander im Speicher # Lade die Adresse des ersten Wortes # Lade erstes Wort # Lade zweites Wort
62 Die Maschinenprogrammebene eines Rechners Jörg Roth F.e Sprungbefehle Befehl Beschreibung Vorzeichen beq Rs, Rt, Label Springe wenn Rs =Rt egal bne Rs, Rt, Label Springe wenn Rs Rt egal bgez Rs, Label Springe wenn Rs 0 mit bgtz Rs, Label Springe wenn Rs > 0 mit blez Rs, Label Springe wenn Rs 0 mit bltz Rs, Label Springe wenn Rs < 0 mit j Label Springe jal Label Unterprogrammaufruf nicht jr Rs Springe zur Adresse in Rs anwendbar jalr Rs Unterprogrammaufruf zur Adresse in Rs
63 Die Maschinenprogrammebene eines Rechners Jörg Roth 332 Bemerkungen: Da jeder MIPS-Befehl 32 Bits umfasst, liegen die Befehle immer passend auf 4-Byte-Blöcken. Die Adresse des ersten Bytes eines Befehls ist damit immer durch 4 teilbar (4 byte alignment). Da die möglichen Sprungziele immer binär auf 00 enden, müssen diese Bits nicht angegeben werden und man definiert nur die Bits ab Bit2 aufwärts. Die branch-befehle (b...) verwenden relative Sprungziele. Der immediate-operand definiert den Abstand zur Adresse des aktuellen Befehls. Negative Distanz: Sprung vor den aktuellen Befehl. Positive Distanz: Sprung hinter den aktuellen Befehl. Der Bereich für immediate-operanden ist bis Dieser wird mit 4 multipliziert (wegen alignment) und zur aktuellen Befehlsadresse hinzugezählt. Es sind damit Sprungweiten von ca. +/-128k möglich
64 Die Maschinenprogrammebene eines Rechners Jörg Roth 333 Beispiele: Sprung zurück: loop: add $s0, $s1, $s2 beq $s0,$s1,loop# Sprungweite -4, kodiert als immediate-op. -1 Sprung nach vorne: beq $s0,$s1,labx # Sprungweite +8, kodiert als immediate-op. 2 add $s0, $s1, $s2 labx: add $s0, $s1, $s2 Der Assembler-Entwickler gibt auch bei relativen Sprüngen ein Label als Ziel an. Der Assembler berechnet automatisch die Distanz und meldet ggfs. einen Fehler wenn der Sprung zu weit geht.
65 Die Maschinenprogrammebene eines Rechners Jörg Roth 334 Bemerkungen zu absoluten Sprüngen: Die j...-befehle verwenden absolute Sprungadressen. Absolute Adressen in den J-Format-Befehlen haben 26 Bit. Da die letzten 2 Bits 00 lauten, sind Sprünge im Bereich 2 28 (0 256 MB) möglich. Die MIPS Architektur ermöglicht zwar einen Adressraum von 2 32 Bytes (4GB), die Adressen oberhalb von 256 MB können allerdings nicht mit den J-Format-Sprüngen erreicht werden. Die Sprungbefehle mit Registerinhalten (jr, jalr) und relative Sprünge kennen diese Grenze zwar nicht, dennoch wird nur der Bereich bis 256 MB als Text-Segment (der Code-Bereich) definiert. Die Befehle jal und jalr funktionieren wie j bzw. jr. Vor dem Sprung wird aber die aktuelle Befehlsadresse + 4 in das Register $ra geschrieben. Damit sind Unterprogramme möglich, die nach der Beendigung mit jr $ra hinter den Aufrufbefehl springen.
66 Die Maschinenprogrammebene eines Rechners Jörg Roth F.f Pseudobefehle Pseudobefehle sind nicht nativ im MIPS-Prozessor realisiert. Sie vereinfachen die Assembler-Programmierung und erhöhen die Lesbarkeit von Assembler-Programmen. Die Menge von Pseudo-Befehlen ist je nach Assembler unterschiedlich. Auch die Übersetzung von Pseudo-Befehlen in native Befehle ist unterschiedlich. Typische MIPS-Pseudobefehle werden in 1, 2 oder 3 native Befehle übersetzt.
67 Die Maschinenprogrammebene eines Rechners Jörg Roth 336 Einige Pseudobefehle: Befehl Beschreibung Realisierung li Rd, I Rd := I ori Rd, $zero, I # 16-Bit-I oder lui $at, I ( ) ori Rd, $at, I (15...0) # 32-Bit-I la Rd, Label Rd := Adresse des Labels Wie li, der Assembler verhindert aber das Auswerten von "Label" la kann ohne Hilfe des Assemblers nicht durch andere Befehle ersetzt werden! move Rd, Rs Rd := Rs or Rd, $zero, Rs nop tue nichts or $zero, $zero, $zero oder sll $zero, $zero, 0
68 Die Maschinenprogrammebene eines Rechners Jörg Roth 337 b Label Befehl Beschreibung Realisierung addi Rt, Rs, I andi Rt, Rs, I ori Rt, Rs, I... lb Rt, Addr(Rs) lbu Rt, Addr(Rs) lw Rt, Addr(Rs) sb Rt, Addr(Rs) sw Rt, Addr(Rs) Relativer Sprung...i-Befehle mit 32-Bit-I-Operand wie lb etc., nur dass Addr mit mehr als 16 Bit beq $zero, $zero, Label lui $at, I ( ) ori $at, $at, I (15...0) add Rt, Rs, $at lui $at, Hi-Addr lb $s0, Lo-Addr($at) # bzw. lbu, lw, sb, sw # bzw. and, or...
69 Die Maschinenprogrammebene eines Rechners Jörg Roth F.g Speicherorganisation Aufteilung des verfügbaren Adressraums: 0x Reserviert 4 MB 0x MB Text Segment 0x $gp = 0x Statische Daten 64 kb 0x Dynamische Daten ca. 1,8 GB $sp Stapel 0x7FFF FFFF 0x Reserviert 2 GB 0xFFFF FFFF
70 Die Maschinenprogrammebene eines Rechners Jörg Roth 339 Bemerkungen: Die Bereiche vor 0x und ab 0x sind reserviert. Der verbleibende Bereich bis 0x ist das Text Segment, in dem sich der Programmcode befindet. Sprungbefehle nach dem J-Format können keine größeren Adressen anspringen. Im Bereich statischer Daten verweist $gp auf die Mitte. Damit können Speicherzugriffe ohne Pseudobefehle mit nur einem Befehl formuliert werden. Z.B. lw $s0, -0x8000($gp) # Zugriff auf Adresse 0x Da der Bereich statischer Daten 64k umfasst, kann man mit einem 16-Bit- Offset den gesamten Bereich adressieren. Ohne $gp würde dieser Zugriff zwei Befehle erfordern: lui $at, 4096 # entspricht 0x lw $s0,0($at)
71 Die Maschinenprogrammebene eines Rechners Jörg Roth 340 Der Stapel und der Bereich dynamischer Daten wachsen in entgegengesetzer Richtung. Damit steht bei ungleicher Benutzung beiden Bereiche immer der maximale Rest zur Verfügung. Der Bereich dynamischer Daten wird vom Betriebssystem verwaltet. Es gibt keine Register im MIPS, die diese Verwaltung unterstützen. Der Stapel wächst per Konvention in die Richtung niedriger Adressen. $sp zeigt auf das zuletzt gefüllte Stapel-Element. Der Stapel muss nicht unbedingt bei 0x7FFF FFFF beginnen. Stehen weniger als 2GB Speicher zur Verfügung kann der Stapel auch bei einer kleineren Adressen beginnen.
72 Die Maschinenprogrammebene eines Rechners Jörg Roth GTypische Anwendungsfälle Wir betrachten im Folgenden typische Fälle aus dem Bereich imperativer Programmiersprachen und beschreiben, wie diese in MIPS-Assembler realisiert werden. Compiler, die höhere Programmiersprachen in Maschinensprache übersetzen, müssen über ein Regelwerk verfügen, die Programmstrukturen in Maschinensprache-Sequenzen zu übersetzen.
73 Die Maschinenprogrammebene eines Rechners Jörg Roth G.aif-then-else Höhere Programmiersprache: if (<Bedingung>) then <Anweisungen1> else <Anweisungen2> Assembler:... # Code um die Bedingung zu berechnen b... else # Bedingung, um in den Else-Zweig zu springen... # Code der Anweisungen1 j exit else:... # Code für Anweisungen2 exit: Bemerkung: Das in imperativen Sprachen verpönte "goto" ist die einzige Möglichkeit in Maschinensprache Kontrollstrukturen abzubilden.
74 Die Maschinenprogrammebene eines Rechners Jörg Roth 343 Weitere Bemerkung: Labels müssen global eindeutig sein. Verwendet man mehrere der dargestellten Strukturen, müssen die Labels "else" und "exit" z.b. durch Nummern ("else1" etc.) eindeutig gemacht werden. Konkretes Beispiel: if ($s1<$s2) then $s3:=$s3+1; else $s4:=2*$s4; Assembler: slt $t0, $s1, $s2 # $t0=1 wenn $s1<$s2 beq $t0, $zero, else # wenn $t0=0: else-zweig addi $s3,$s3,1 # then-zweig j exit # an das Ende springen else: add $s4, $s4, $s4 # else-zweig exit:
75 Die Maschinenprogrammebene eines Rechners Jörg Roth G.bswitch-case Höhere Programmiersprache: switch (<int-variable>) case 0:<Anweisungen0> case 1:<Anweisungen1>... case n:<anweisungenn> Idee: Wir legen alle möglichen Sprungziele case 0, case 1,... case n in einem Feld ab. Wir laden anhand der Variablen das richtige Sprungziel und springen mit jr.
76 Die Maschinenprogrammebene eines Rechners Jörg Roth 345 Assembler: sll $t0, $t0, 2 # $t0*4 ($t0 sei der switch-wert) la $t1, jumptable add $t0, $t0, $t1 # Berechne switch-wert*4+adr(jumptable) lw $t0, 0($t0) # Lade jumptable[<switch-wert>] jr $t0 # Springe gemäß Registerinhalt case0:... # Code der Anweisungen0 j exit case1:... # Code der Anweisungen1 j exit... casen:... # Code der Anweisungenn exit:
77 Die Maschinenprogrammebene eines Rechners Jörg Roth 346 Konkretes Beispiel: switch ($t0) case 0: $s3:=$s3+1; case 1: $s4:=2*$s4; case 2: $s5:=0; Assembler: sll $t0, $t0, 2 # $t0*4 ($t0 sei der switch-wert) la $t1, jumptable add $t0, $t0, $t1 # Berechne switch-wert*4+adr(jumptable) lw $t0, 0($t0) # Lade jumptable[<switch-wert>] jr $t0 # Springe gemäß Registerinhalt case0: addi $s3,$s3,1 # Code für case 0 j exit
78 Die Maschinenprogrammebene eines Rechners Jörg Roth 347 case1: add $s4, $s4, $s4# Code für case 1 j exit case2: li $s5,0 # Code für case 2 exit: Bemerkungen: Es wird keine Überprüfung durchgeführt, ob der switch-wert innerhalb der erwarteten Grenzen liegt. In der aktuellen Fassung sind die Ergebnisse bei einer Bereichsverletzung nicht vorhersehbar (und in der Regel katastrophal). Die Sprungtabelle muss vor der ersten Benutzung initialisiert werden:
79 Die Maschinenprogrammebene eines Rechners Jörg Roth 348.data jumptable:.space 12 # Platz für 3 Adressen.text main: la $s0, jumptable # Adresse der Sprungtabelle in $s0 la $t1, case0 sw $t1,0($s0) # Zieladresse in jumptable[0] ablegen la $t1, case1 sw $t1,4($s0) # Zieladresse in jumptable[1] ablegen la $t1, case2 sw $t1,8($s0) # Zieladresse in jumptable[2] ablegen...
80 Die Maschinenprogrammebene eines Rechners Jörg Roth 349 Bemerkung: Diese Initialisierung muss nicht zur Laufzeit erfolgen. Viel effizienter ist, die Sprungadressen schon zur Laufzeit durch den Assembler eintragen zu lassen. Die resultierende Code-Variante:.data jumptable:.word case0.word case1.word case2.text main:... # Code vor switch
81 Die Maschinenprogrammebene eines Rechners Jörg Roth 350 sll $t0, $t0, 2 # $t0*4 ($t0 sei der switch-wert) la $t1, jumptable add $t0, $t0, $t1 # Berechne switch-wert*4+adr(jumptable) lw $t0, 0($t0) # Lade jumptable[<switch-wert>] jr $t0 # Springe gemäß Registerinhalt case0: addi $s3,$s3,1 # Code für case 0 j exit case1: add $s4, $s4, $s4# Code für case 1 j exit case2: li $s5,0 # Code für case 2 exit:... # Code nach switch
82 Die Maschinenprogrammebene eines Rechners Jörg Roth G.c while- und for-schleifen Höhere Programmiersprache: while (<Bedingung>) <Anweisungen> Assembler: loop:... # Code um die Bedingung zu berechnen b... exit # Bedingung, um in die Schleife zu verlassen... # Code der Anweisungen j loop # Schleife wiederholen exit:
83 Die Maschinenprogrammebene eines Rechners Jörg Roth 352 Konkretes Beispiel: while ($s1<$s2) $s1:=$s1+1; $s3:=$s3+1; Assembler: loop: slt $t0, $s1, $s2 # $t0=1 wenn $s1<$s2 beq $t0, $zero, exit # wenn $t0=0: Schleife verlassen addi $s1,$s1,1 # Code der Anweisungen addi $s3,$s3,1 j loop # Schleife wiederholen exit:
84 Die Maschinenprogrammebene eines Rechners Jörg Roth 353 Höhere Programmiersprache: for i:=<startwert> to <endwert> do <Anweisungen> Assembler: li $t0,<startwert> # Zähler initialisieren, $t0 sei die Zählvariable li $t1,<endwert+1> # $t1 sei <endwert+1> loop: beq $t0,$t1,exit # Endwert schon abgearbeitet... # Code der Anweisungen addi $t0,$t0,1 # Zähler inkrementieren j loop # Schleife wiederholen exit: Bemerkung: diese Konstruktion überprüft nicht, ob der Endwert erreicht werden kann. Gibt man einen endwert<startwert an, rechnet die Schleife bis $t0 nach einem Überlauf den endwert erreicht.
85 Die Maschinenprogrammebene eines Rechners Jörg Roth 354 Konkretes Beispiel: for $t0:=1 to 10 do $t2:=$t2*2; Assembler: li $t0,1 li $t1,11 loop: beq $t0,$t1,exit add $t2,$t2,$t2 addi $t0,$t0,1 j loop exit: # Zähler initialisieren, $t0 sei die Zählvariable # $t1 sei <endwert+1> # Endwert schon abgearbeitet # Code der Anweisungen # Zähler inkrementieren # Schleife wiederholen
86 Die Maschinenprogrammebene eines Rechners Jörg Roth G.dZugriff auf Arrays, Strings Höhere Programmiersprache: Schreiben eines Array-Elements: array[index] := wert Lesen eines Array-Elements: variable := array[index] Bemerkung: Für die Entwicklung in Maschinensprache muss der Entwickler wissen, wie viele Bytes der zugrunde liegende Datentyp beansprucht, um auf ein bestimmtes Element zugreifen zu können. In höheren Programmiersprachen wird diese Information beim Array-Zugriff verborgen.
87 Die Maschinenprogrammebene eines Rechners Jörg Roth 356 Konkretes Beispiel: Variablen: wordarray: ARRAY [0..2] OF WORD = {1, 2, 3}; bytearray: ARRAY[0..2] OF BYTE = {7, 8, 9}; $s0 := wordarray[$t0]; $s1 := bytearray[$t1]: Assembler:.data wordarray:.word 1.word 2.word 3 bytearray:.byte 7.byte 8.byte 9
88 Die Maschinenprogrammebene eines Rechners Jörg Roth 357.text main:... la $t2, wordarray sll $t0, $t0, 2 # $t0*4 ($t0 sei der Index für wordarray) add $t0, $t0, $t2 # $t0 := wordarray+4*index lw $s0, 0($t0) # $s0 := wordarray[$t0] la $t2, bytearray add $t1, $t1, $t2 # $t1 := bytearray+1*index lb $s1, 0($t1) # $s1 := wordarray[$t1] Bemerkung: Es findet keine Erkennung auf Bereichsverletzungen statt. Damit kann man u.u. auf andere Daten oder sogar Code zugreifen. Programme, die keinen Bereichstest durchführen führen u.u. zu unmotivierten Abstürzen oder sind für bösartige Software angreifbar.
89 Die Maschinenprogrammebene eines Rechners Jörg Roth 358 Strings Strings werden wie byte-arrays flexibler Länge behandelt. Die Länge eines Strings erkennt man entweder durch ein spezielles Zeichen (in der Regel 0), wie in der Programmiersprache C oder durch eine vorangestellte Längenangabe wie in Pascal. Da man einen String häufig zeichenweise durchläuft, bietet es sich an, einen Zeiger auf das aktuelle Zeichen zu verwalten, der zeichenweise weitergeschaltet wird.
90 Die Maschinenprogrammebene eines Rechners Jörg Roth 359 Möglichkeiten des Zeichenzugriffs in Strings: Zugriff über zwei Register Speicher h a l l o 0x00 + $t0 $t1 Register adr 2 Zugriff über einen Zeiger Speicher h a l l o 0x00 Register $t0 adr+2
91 Die Maschinenprogrammebene eines Rechners Jörg Roth 360 Konkretes Beispiel: Variable text: String="halloABC"; $s0=strlen(text); // Länge des Strings bestimmen text=toupper(text); // Alle Zeichen nach "groß" konvertieren (z.b. a -> A ) Assembler:.data text:.asciiz "halloabc".text main: la $t0,text # Pointer auf String-Anfang setzen li $s0,0 # Anzahl der Zeichen auf 0 setzen loop1: lb $t1,0($t0) # Lade Zeichen beq $t1,$zero,toupper # Wenn 0: Zählen fertig addi $s0,$s0,1 # Weiterzählen addi $t0,$t0,1 # Pointer weiterschalten j loop1
92 Die Maschinenprogrammebene eines Rechners Jörg Roth 361 toupper: la $t0,text # Pointer auf String-Anfang setzen loop2: lb $t1,0($t0) # Lade Zeichen beq $t1,$zero,end # Wenn 0: Zählen fertig andi $t1, $t1, 223 # Nach UpperCase verwandeln sb $t1, 0($t0) # und Zeichen zurückspeichern addi $t0,$t0,1 # Pointer weiterschalten j loop2 end:
93 Die Maschinenprogrammebene eines Rechners Jörg Roth G.e Unterprogramme Unterprogramme können wie in höheren Programmiersprachen von verschiedenen Aufrufstellen aus aufgerufen werden. So kann man eine häufig benutzte Funktion einmal im Speicher ablegen und beliebig häufig benutzen. Im Gegensatz zu höheren Programmiersprachen muss der Entwickler aber die Organisation des Aufrufs (insb. Rücksprung, Parameterübergabe, Retten von lokalen Variablen) selbst vornehmen.
94 Die Maschinenprogrammebene eines Rechners Jörg Roth 363 Ablauf von Unterprogramm-Aufrufen: Hinterlegen der Parameter in die vorgesehenen Register ($a0 $a3). jal Unterprogramm-Label damit wird die Adresse des nächsten Befehls automatisch in $ra geschrieben. Im Unterprogramm: Wenn notwendig, Register auf Stapel sichern (insb. $s0 $s7 und $ra). Die eigentliche Funktion berechnen. Potenzielle Rückgabewerte in $v0 $v1 ablegen. Gesicherte Register zurücklesen. jr $ra damit wird in das aufrufende Programm zurückgesprungen (genau hinter den Befehl jal...).
95 Die Maschinenprogrammebene eines Rechners Jörg Roth 364 Beispiel Speicherinhalte tauschen.data word1:.word 100 word2:.word 200 word3:.word 400 word4:.word 500 swap:.text lw $t0, 0($a0) lw $t1, 0($a1) sw $t0, 0($a1) sw $t1, 0($a0) jr $ra # Unterprogramm zum Tauschen von Inhalten # 1. Wort in Register laden # 2. Wort in Register laden # umgekehrt zurückspeichern # Rücksprung ins aufrufende Programm
96 Die Maschinenprogrammebene eines Rechners Jörg Roth 365 main: # Einstiegspunkt des Programms la $a0,word1 # Tausche word1 la $a1,word2 # mit word2 jal swap # Unterprogramm "swap" aufrufen la $a0,word3 la $a1,word4 jal swap # Tausche word3 # mit word4 # Unterprogramm "swap" aufrufen Bemerkung: Da das Unterprogramm swap keine zu sicherernden Register verwendet, entfallen die Punkte "Register auf Stapel sichern" und "Gesicherte Register zurücklesen".
97 Die Maschinenprogrammebene eines Rechners Jörg Roth 366 Verschachtelte Unterprogramme: Ruft ein Unterprogramm ein weiteres Unterprogramm auf, so muss mindestens das Register $ra gesichert werden. jal UP1 Rücksprungadresse in $ra schreiben Hauptprogramm Unterprogramm UP1 jal UP2 Rücksprungadresse in $ra schreiben Unterprogramm UP2 jr $ra jr $ra
98 Die Maschinenprogrammebene eines Rechners Jörg Roth 367 Beispiel: Sortieren von exakt drei Speicherinhalten: Vorgehensweise: Ein Unterprogramm sort2 tauscht zwei Inhalte, wenn sie in der falschen Reihenfolge vorliegen. Ein Unterprogramm sort3 ruft dreimal sort 2 auf mit den Kombinationen (wort1, wort2), (wort2, wort3), (wort1, wort2). Sind diese in der Reihenfolge paarweise sortiert worden, sind alle drei Speicherinhalte sortiert worden..data word1:.word 4 word2:.word 3 word3:.word 2
99 Die Maschinenprogrammebene eines Rechners Jörg Roth 368.text sort2: # Sortieren von zwei Speicherinhalten lw $t0, 0($a0) # 1. Wort in Register laden lw $t1, 0($a1) # 2. Wort in Register laden slt $t2,$t0, $t1 # Vergleich Inhalte bne $zero,$t2,ret # $t2=1, also $t0<$t1, dann nicht tauschen sw $t0, 0($a1) # sonst umgekehrt zurückspeichern sw $t1, 0($a0) ret: jr $ra # Rücksprung ins aufrufende Programm sort3: # Sortieren von drei Speicherinhalten addi $sp,$sp,-16 # Auf dem Stapel Platz für 4 Register freimachen sw $s0,0($sp) # Register $s0, $s1, $s2, $ra auf den Stapel sw $s1,4($sp) sw $s2,8($sp) sw $ra,12($sp) # Wichtig: auch die Rücksprungadresse sichern
100 Die Maschinenprogrammebene eines Rechners Jörg Roth 369 move $s0,$a0 # Kopiere die drei Argumente in $s0, $s1, $s2 move $s1,$a1 move $s2,$a2 jal sort2 move $a0,$s1 move $a1,$s2 jal sort2 move $a0,$s0 move $a1,$s1 jal sort2 # Sortiere Wort1 und Wort2 # Sortiere Wort2 und Wort3 # Sortiere nochmal Wort1 und Wort2
101 Die Maschinenprogrammebene eines Rechners Jörg Roth 370 lw $s0,0($sp) # Register $s0, $s1, $s2, $ra von dem Stapel lw $s1,4($sp) lw $s2,8($sp) lw $ra,12($sp) addi $sp,$sp,16 # Stapelzeiger auf Wert vor dem Aufruf setzen jr $ra # Rücksprung ins aufrufende Programm main: la $a0,word1 la $a1,word2 la $a2,word3 jal sort3 # Einstiegspunkt des Programms # Sortieren von word1, # word2 # und word3 # Unterprogramm "sort3" aufrufen
102 Die Maschinenprogrammebene eines Rechners Jörg Roth 371 Bemerkung zu $fp: Bei Funktionen mit vielen Parametern reichen die Register $a0 $a3 nicht aus. Deshalb kann der Aufrufer die Parameter auch auf dem Stapel hinterlegen. Damit das Unterprogramm bequem auf die Parameter auf dem Stapel zugreifen kann, kann das Register $fp eingesetzt werden. Es zeigt dann auf das Parameter-Wort mit der höchsten Adresse. Dadurch kann mit 0($fp), -4($fp), -8($fp) etc. auf die Parameter zugegriffen werden. Die Verwendung von $fp ist nicht zwingend. Auch sind andere Konventionen denkbar, auf die Parameter auf dem Stapel zuzugreifen.
103 Die Maschinenprogrammebene eines Rechners Jörg Roth 372 Rekursive Unterprogrammaufrufe: Da die lokalen Register und die Rücksprungadressen auf dem Stapel gespeichert werden, kann ein Unterprogramm sich selbst aufrufen. Beispiel Berechnung der Fakultät: x!:=x (x-1) (x-2) Es gilt: x!= 1 wenn x 1. x ( x 1)! sonst Damit kann man die Berechnung von x! rekursiv implementieren.
TECHNISCHE HOCHSCHULE NÜRNBERG GEORG SIMON OHM. Die MARS Umgebung
Die MARS Umgebung MARS ist ein Simulationswerkzeug für MIPS Prozessoren Es enthält einen Assembler und eine Laufzeitumgebung Da das Wirtsystem (z.b. Windows) auf einem anderen Prozessor basiert, werden
Mehr5.BMaschinensprache und Assembler
Die Maschinenprogrammebene eines Rechners Jörg Roth 268 5.BMaschinensprache und Assembler Die vom Prozessor ausführbaren Befehle liegen im Binärformat vor. Nur solche Befehle sind direkt ausführbar. So
MehrDie Maschinenprogrammebene eines Rechners Jörg Roth 294
Die Maschinenprogrammebene eines Rechners Jörg Roth 294 5.E Die SPIM-Umgebung SPIM ist ein Simulationswerkzeug für MIPS-Prozessoren Es enthält einen Assembler und eine Laufzeitumgebung Da das Wirtsystem
MehrArithmetik, Register und Speicherzugriff. Grundlagen der Rechnerarchitektur Assembler 9
Arithmetik, Register und Speicherzugriff Grundlagen der Rechnerarchitektur Assembler 9 Arithmetik und Zuweisungen Einfache Arithmetik mit Zuweisung C Programm: a = b + c; d = a e; MIPS Instruktionen: Komplexere
MehrZusammenfassung: Grundlagen der Informatik Zahlensysteme, b-adische Darstellung, Umrechnung Beispiel: Umrechnung von ( ) 10 ins Dualsystem
Zusammenfassung: Grundlagen der Informatik - Seite von 6 Zusammenfassung: Grundlagen der Informatik Zahlensysteme, b-adische Darstellung, Umrechnung Beispiel: Umrechnung von (69.59375) 0 ins Dualsystem
MehrAssembler am Beispiel der MIPS Architektur
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.
MehrProgrammiersprachen Einführung in C
Programmiersprachen Einführung in C Teil 1: Von der Maschinensprache zu C Prof. Dr. Maschinensprache: MIPS R2000 Was bewirkt folgendes Programm: 00100111101111011111111111100000 10101111101111110000000000010100
MehrBeispiel: A[300] = h + A[300]
Beispiel: A[300] = h + A[300] $t1 sei Basisadresse von A und h in $s2 gespeichert. Assembler Code? Maschinen Code (der Einfachheit halber mit Dezimalzahlen)? op rs rt rd adr/shamt funct Instruktion Format
Mehr32 Bit Konstanten und Adressierung. Grundlagen der Rechnerarchitektur Assembler 78
32 Bit Konstanten und Adressierung Grundlagen der Rechnerarchitektur Assembler 78 Immediate kann nur 16 Bit lang sein Erinnerung: Laden einer Konstante in ein Register addi $t0, $zero, 200 Als Maschinen
Mehr28. März Name:. Vorname. Matr.-Nr:. Studiengang
Klausur 28. März 2011 Name:. Vorname Matr.-Nr:. Studiengang Hinweise: Bitte füllen Sie vor dem Bearbeiten der Aufgaben das Deckblatt sorgfältig aus. Zur Klausur zugelassen sind ausschließlich Schreibutensilien,
MehrRO-Tutorien 15 und 16
Tutorien zur Vorlesung Rechnerorganisation Tutorienwoche 5 am 25.05.2011 1 Christian A. Mandery: KIT Universität des Landes Baden-Württemberg und nationales Grossforschungszentrum in der Helmholtz-Gemeinschaft
MehrUnterprogramme. Unterprogramme
Unterprogramme Unterprogramme wichtiges Hilfsmittel für mehrfach benötigte Programmabschnitte spielen in höheren Programmiersprachen eine wesentliche Rolle in Assembler sind bestimmte Konventionen nötig
MehrHeute nur MIPS-Praxis (4 Aufgaben)
Themen heute Heute nur MIPS-Praxis (4 Aufgaben) Hinweis: Diese Aufgaben findet ihr auf den Übungsblättern zu den Tutorien (bei Aufgabe 4 wurde eine Teilaufgabe und im Tutorium #6 bereits geklärte Wissensfragen
MehrÜbungsblatt 10 (Block C 2) (16 Punkte)
georg.von-der-brueggen [ ] tu-dortmund.de ulrich.gabor [ ] tu-dortmund.de pascal.libuschewski [ ] tu-dortmund.de Übung zur Vorlesung Rechnerstrukturen Wintersemester 2016 Übungsblatt 10 (Block C 2) (16
MehrTechnische Informatik 1
Technische Informatik 1 2 Instruktionssatz Lothar Thiele Computer Engineering and Networks Laboratory Instruktionsverarbeitung 2 2 Übersetzung Das Kapitel 2 der Vorlesung setzt sich mit der Maschinensprache
MehrTECHNISCHE HOCHSCHULE NÜRNBERG GEORG SIMON OHM Die Mikroprogrammebene eines Rechners Das Abarbeiten eines Arbeitszyklus eines einzelnen Befehls besteht selbst wieder aus verschiedenen Schritten, z.b. Befehl
Mehr21. Februar Name:. Vorname. Matr.-Nr:. Studiengang
Klausur 21. Februar 2011 Name:. Vorname Matr.-Nr:. Studiengang Hinweise: Bitte füllen Sie vor dem Bearbeiten der Aufgaben das Deckblatt sorgfältig aus. Zur Klausur zugelassen sind ausschließlich Schreibutensilien,
MehrKlausur Mikroprozessortechnik 29. März 2010
Klausur Mikroprozessortechnik 29. März 2010 Name:... Vorname:... Matr.-Nr:... Studiengang:... Hinweise: Bitte füllen Sie vor dem Bearbeiten der Aufgaben das Deckblatt sorgfältig aus. Zur Klausur zugelassen
MehrGrundlagen zur Assemblerprogrammierung unter SPIM im Sommersemester Lorenz Schauer Mobile & Verteilte Systeme
Grundlagen zur Assemblerprogrammierung unter SPIM im Sommersemester 2016 Lorenz Schauer Mobile & Verteilte Systeme 12. Juli 2016 Agenda heute Grundlagen: Unterprogramme I Call-by-Value (CBV) vs. Call-by-Reference
MehrAssembler Programmierung Motivation. Informatik II SS 2004 Teil 4: Assembler Programmierung. Assembler vs. Maschinensprache
Assembler Programmierung Motivation Informatik II SS 2004 Teil 4: Assembler Programmierung Was ist ein Programm? Eine Reihe von Befehlen, die der Ausführung einer Aufgabe dient Dazu wird das Programm sequentiell
MehrMikroprozessortechnik. 03. April 2012
Klausur 03. April 2012 Name:. Vorname Matr.-Nr:. Studiengang Hinweise: Bitte füllen Sie vor dem Bearbeiten der Aufgaben das Deckblatt sorgfältig aus. Die Klausur besteht aus 6 doppelseitig bedruckten Blättern.
Mehr24. Februar Name:. Vorname. Matr.-Nr:. Studiengang
Klausur 24. Februar 2012 Name:. Vorname Matr.-Nr:. Studiengang Hinweise: Bitte füllen Sie vor dem Bearbeiten der Aufgaben das Deckblatt sorgfältig aus. Die Klausur besteht aus 6 doppelseitig bedruckten
MehrLösungsvorschlag zur 3. Übung
Prof Frederik Armknecht Sascha Müller Daniel Mäurer Grundlagen der Informatik Wintersemester 09/10 1 Präsenzübungen 11 Schnelltest Lösungsvorschlag zur Übung a) Welche der folgenden Aussagen entsprechen
MehrMotivation und Überblick
Motivation und Überblick Drei große Bereiche der Vorlesung: Darstellung von Zahlen in Rechnern Verarbeitung von Binärdaten auf der Ebene digitaler Schaltungen Programmierung auf Maschinenebene und relativ
MehrEinführung in die Systemprogrammierung
Einführung in die Systemprogrammierung Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 9. Juli 2015 Der MIPS-Prozessor MIPS R2000, von iamretro.gr Kurze Geschichte der MIPS-Architektur
MehrKap 4. 4 Die Mikroprogrammebene eines Rechners
4 Die Mikroprogrammebene eines Rechners Das Abarbeiten eines Arbeitszyklus eines einzelnen Befehls besteht selbst wieder aus verschiedenen Schritten (Befehl holen, Befehl dekodieren, Operanden holen etc.).
MehrOffenbar hängt das Ergebnis nur von der Summe der beiden Argumente ab...
0 1 2 0 2 1 1 2 0 2 1 0 Offenbar hängt das Ergebnis nur von der Summe der beiden Argumente ab... 0 1 2 0 1 2 1 1 3 2 2 3 212 Um solche Tabellen leicht implementieren zu können, stellt Java das switch-statement
MehrVorlesung Rechnerarchitektur
Vorlesung Rechnerarchitektur Sommersemester 2017 Carsten Hahn 8. Juni 2017 Agenda Grundlagen: Wiederholung Kontroll-Strukturen Stack-Speicher Unterprogramme I Unterprogramme II Call-by-Value (CBV) vs.
MehrInstitut für Informatik Prof. Dr. D. Hogrefe Dipl.-Inf. R. Soltwisch, Dipl.-Inform. M. Ebner, Prof. Dr. D. Hogrefe Informatik II - SS 04.
Kontrollstrukturen Informatik II SS 2004 Teil 4: Assembler Programmierung Sprünge (bedingte und unbedingte) If-then-else, Case Loop (n Durchläufe) While (Abbruchbedingung) Institut für Informatik Prof.
MehrStephan Brumme, SST, 2.FS, Matrikelnr. 70 25 44
Aufgabe 33 a) Der Pseudobefehl move $rd,$rs wird als addu $rd,$0,$rs übersetzt. Dabei macht sich SPIM zunutze, dass das Register $0 immer Null ist. Somit wird das Register $rd ersetzt durch $rd=0+$rs=$rs,
Mehr######################### Zeichenkette auswerten ###################################
Informatik 3 Übung 06 Georg Kuschk 6.3) MIPS #Aufgabe 6.3) #Georg Kuschk #ACHTUNG : Da laut Forum davon ausgegangen werden soll, dass der Eingabewert, # falls er denn kleiner gleich 10 Stellen besitzt,
MehrDie Mikroprogrammebene eines Rechners
Die Mikroprogrammebene eines Rechners Das Abarbeiten eines Arbeitszyklus eines einzelnen Befehls besteht selbst wieder aus verschiedenen Schritten, z.b. Befehl holen Befehl dekodieren Operanden holen etc.
MehrTechnische Informatik 1 Übung 2 Assembler (Computerübung) Matthias Meyer
Technische Informatik 1 Übung 2 Assembler (Computerübung) Matthias Meyer Ziele der Übung Aufgabe 1 Ein lauffähiges Assembler-Programm Umgang mit dem Debugger Aufgabe 2 (Zusatzaufgabe) Lesen und Analysieren
MehrWeitere Arithmetik. Grundlagen der Rechnerarchitektur Assembler 33
Weitere Arithmetik Grundlagen der Rechnerarchitektur Assembler 33 Die speziellen Register lo und hi Erinnerung: ganzzahliges Produkt von zwei n Bit Zahlen benötigt bis zu 2n Bits Eine MIPS Instruktion
MehrMIPS-Programmierung in der WebSPIM-Umgebung (0.3)
MIPS-Programmierung in der WebSPIM-Umgebung (0.3) C. Reichenbach, mailto:reichenbach@cs.uni-frankfurt.de 12. Mai 2013 1 Einführung WebSPIM ist ein Web-basierter MIPS32-Simulator, dessen MIPS-Funktionalität
MehrBesprechung des 4. Übungsblattes Was ist MIPS? SPIM-Simulator MIPS-Befehlsformate MIPS-Befehle Assemblerdirektiven Syscalls in MIPS
Organisatorisches Es gibt kein Übungsblatt zur heutigen Abgabe, da sich durch ausfallende Vorlesungstermine entsprechende Verschiebungen ergeben haben Das jetzige Übungsblatt ist abzugeben bis zum nächsten
MehrLösungsvorschlag 10. Übung Technische Grundlagen der Informatik II Sommersemester 2009
Fachgebiet Rechnerarchitektur Fachbereich Informatik Lösungsvorschlag. Übung Technische Grundlagen der Informatik II Sommersemester 29 Aufgabe.: MIPS-Kontrollsignale Für die 5 Befehlstypen a) R-Format
MehrTechnische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015
Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015 Ziele der Übung Aufgabe 1 Aufbau und Aufruf von Funktionen in Assembler Codeanalyse
MehrKap.2 Befehlsschnittstelle. Prozessoren, externe Sicht
Kap.2 Befehlsschnittstelle Prozessoren, externe Sicht 2 Befehlsschnittstelle 2.1 elementare Datentypen, Operationen 2.2 logische Speicherorganisation 2.3 Maschinenbefehlssatz 2.4 Klassifikation von Befehlssätzen
MehrLösungsvorschlag 9. Übung Technische Grundlagen der Informatik II Sommersemester 2009
Fachgebiet Rechnerarchitektur Fachbereich Informatik Lösungsvorschlag 9. Übung Technische Grundlagen der Informatik II Sommersemester 2009 Aufgabe 9.1: Dinatos-Algorithmus-Analyse Die folgenden Verilog-Zeilen
MehrGrundlagen der Informatik
Grundlagen der Informatik (Wintersemester 2008/2009) Jörg Roth Jörg Roth 2 0 Motivation und Überblick Drei große Bereiche der Vorlesung: Darstellung von Zahlen in Rechnern Verarbeitung von Binärdaten auf
MehrGrundlagen der Informationsverarbeitung:
Grundlagen der Informationsverarbeitung: Befehlssatz und Assembler-Sprache Prof. Dr.-Ing. habil. Ulrike Lucke Durchgeführt von Prof. Dr. rer. nat. habil. Mario Schölzel Maximaler Raum für Titelbild (wenn
Mehr10. Die Adressierungsarten des MSP 430
10. Die Adressierungsarten 10.1 Übersicht über die Adressierungsarten 10.2 -Operanden 10.3 Indexregister mit Distanz 10.4 Symbolische (relativ zum ) 10.5 Absolute 10.6 Indirekte 10.7 Indirekte Adressierung
MehrSprungbefehle und Kontroll-Strukturen
Sprungbefehle und Kontroll-Strukturen Statusregister und Flags Sprungbefehle Kontrollstrukturen Das Status-Register 1 Register-Satz des ATmega128 Universal-Register (8Bit) R0..R15 16 Bit Program counter
MehrWie rechnet ein Rechner?
0 Motivation Jörg Roth 2 Wir gehen in dieser Vorlesung der Frage nach Wie rechnet ein Rechner? Als Softwareentwickler könnten wir in einem Programm z.b. folgende Anweisung schreiben: a = a+2*b; Wie wird
MehrEinführung in die Systemprogrammierung 01
Einführung in die Systemprogrammierung 01 Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 24. April 2013 Administrativa Ab nächster Woche bitte Laptops in Übungen mitbringen OLAT-Paßwort
MehrKap.3 Mikroarchitektur. Prozessoren, interne Sicht
Kap.3 Mikroarchitektur Prozessoren, interne Sicht 3.1 Elementare Datentypen, Operationen und ihre Realisierung (siehe 2.1) 3.2 Mikroprogrammierung 3.3 Einfache Implementierung von MIPS 3.4 Pipelining Implementierung
Mehr9. Die Adressierungsarten des MSP 430
9. Die Adressierungsarten 9.1 Übersicht über die Adressierungsarten 9.2 -Operanden 9.3 Indexregister mit Distanz 9.4 Symbolische (relativ zum ) 9.5 Absolute 9.6 Indirekte 9.7 Indirekte Adressierung mit
Mehr68000 Assembler. WAS ist ein Assembler? Ein System, das den Programmierer hilft, eine maschinennahe Programmierung zu realisieren.
WAS ist ein Assembler? Ein System, das den Programmierer hilft, eine maschinennahe Programmierung zu realisieren. Ein Programm liegt der CPU in binärer Form vor und wird durch den Assembler in einer primitiven
MehrRepetitorium Programmieren I + II
Repetitorium Programmieren I + II Stephan Gimbel Johanna Mensik Michael Roth 6. März 2012 Agenda 1 Operatoren 2 Datentypen Gleitpunkt Zahl Typkonvertierung 3 Strommanipulatoren 4 Bedingungen if-else switch-case
MehrDatenpfad einer einfachen MIPS CPU
Datenpfad einer einfachen MIPS CPU Die Branch Instruktion beq Grundlagen der Rechnerarchitektur Prozessor 13 Betrachten nun Branch Instruktion beq Erinnerung, Branch Instruktionen beq ist vom I Typ Format:
MehrGrundlagen der Rechnerarchitektur
Grundlagen der Rechnerarchitektur Prozessor Übersicht Datenpfad Control Pipelining Data Hazards Control Hazards Multiple Issue Grundlagen der Rechnerarchitektur Prozessor 2 Datenpfad einer einfachen MIPS
MehrRechnerarchitektur. Marián Vajteršic und Helmut A. Mayer
Rechnerarchitektur Marián Vajteršic und Helmut A. Mayer Fachbereich Computerwissenschaften Universität Salzburg marian@cosy.sbg.ac.at und helmut@cosy.sbg.ac.at Tel.: 8044-6344 und 8044-6315 3. Mai 2017
MehrInformatik II SS 2004 Teil 4-1: Assembler Programmierung
Assembler Programmierung Motivation Informatik II SS 2004 Teil 4-1: Assembler Programmierung Prof. Dr. Dieter Hogrefe Dipl.-Inform. Michael Ebner Lehrstuhl für Telematik Institut für Informatik Was ist
Mehr7 Laufzeit-Speicherverwaltung
7.1 Grundlagen Bevor wir die Code-Generierung betrachten, müssen wir uns Gedanken über zur Laufzeit des zu generierenden Programms notwendige Aktivitäten zur Zuordnung und Freigabe von Speicherplatz machen.
Mehr9. Assembler: Der Prozessor Motorola 68000
9.1 Architektur des Prozessors M 68000 9.2 Adressierungsarten des M 68000 9-1 9.1 Beschreibung des Prozessors M 68000 Charakteristische Daten des 56 Maschinenbefehle 14 Adressierungsarten Zweiadressmaschine
Mehr9. Assembler: Der Prozessor Motorola 68000
9.1 Architektur des Prozessors M 68000 9.2 Adressierungsarten des M 68000 9-1 9.1 Beschreibung des Prozessors M 68000 Charakteristische Daten des 56 Maschinenbefehle 14 Adressierungsarten Zweiadressmaschine
MehrDatenpfad einer einfachen MIPS CPU
Datenpfad einer einfachen MIPS CPU Zugriff auf den Datenspeicher Grundlagen der Rechnerarchitektur Prozessor 19 Betrachten nun Load und Store Word Erinnerung, Instruktionen lw und sw sind vom I Typ Format:
Mehr7.1 a) Für die Übertragung der Nachricht mittels des Polynoms T(x) werden 40 Bit benötigt.
Informatik 3 Übung 07 Georg Kuschk 7.1) CRC-Verfahren 7.1 a) Für die Übertragung der Nachricht mittels des Polynoms T(x) werden 40 Bit benötigt. 32 Bit für die eigentliche Nachricht M(x) und 8 Bit für
MehrBeim Programmieren mit MMIX habt ihr vielleicht schon öfter eine der folgenden Fehlermeldungen von MMIXAL bekommen:
1 ADRESSIERUNG IN MMIX Beim Programmieren mit MMIX habt ihr vielleicht schon öfter eine der folgenden Fehlermeldungen von MMIXAL bekommen: no base address is close enough to the address A! relative address
MehrMikrocomputertechnik. Unterprogramm
Unterprogramm Ein Teilproblem wird entweder zur mehrmaligen Verwendung oder zur Programmstrukturierung als Unterprogramm codiert. Ein Unterprogramm wird von einem übergeordneten Programm (Hauptprogramm)
MehrInformatik II SS Assembler Programmierung Motivation. Assembler vs. Maschinensprache. Assembler Allgemein Befehle (Maschinensprache)
Assembler Programmierung Motivation Informatik II SS 2006 Kapitel 4: Assembler Programmierung Dr. Michael Ebner Dr. René Soltwisch Lehrstuhl für Telematik Institut für Informatik Was ist ein Programm?
MehrIntensivübung zu Algorithmen und Datenstrukturen
Intensivübung zu Algorithmen und Datenstrukturen Silvia Schreier Informatik 2 Programmiersysteme Martensstraße 3 91058 Erlangen Übersicht Programmierung Fallunterscheidung Flussdiagramm Bedingungen Boolesche
Mehr"Organisation und Technologie von Rechensystemen 4"
Klausur OTRS-4, 29.09.2004 Seite 1 (12) INSTITUT FÜR INFORMATIK Lehrstuhl für Rechnerarchitektur (Informatik 3) Universität Erlangen-Nürnberg Martensstr. 3, 91058 Erlangen 29.09.2004 Klausur zu "Organisation
MehrVon-Neumann-Architektur
Von-Neumann-Architektur Bisher wichtig: Konstruktionsprinzip des Rechenwerkes und Leitwerkes. Neu: Größerer Arbeitsspeicher Ein- und Ausgabewerk (Peripherie) Rechenwerk (ALU) Steuerwerk (CU) Speicher...ppppp...dddddd..
MehrEinführung. Saalübung Informatik II SS Einführung. Einführung
Saalübung Informatik II SS 2006 SPIM-Assembler Teil 1 Einführung Übung zur SPIM-Assemblerprogrammierung Assembler ist die elementare Sprache eines Prozessors Assemblerbefehle repräsentieren die Basisoperationen
MehrEine praktische Einführung in die Programmierung mit der Programmiersprache C
Eine praktische Einführung in die Programmierung mit der Programmiersprache C www.c-howto.de C-HowTo www.c-howto.de Inhaltsverzeichnis 1 Einführung.. 10 1:1 Wozu Programmieren? 10 1.2 Was ist ein Programm?
MehrPIC16 Programmierung in HITECH-C
PIC16 Programmierung in HITECH-C Operatoren: Arithmetische Operatoren - binäre Operatoren + Addition - Subtraktion * Multiplikation / Division % Modulo + - * / sind auf ganzzahlige und reelle Operanden
Mehr1. Teilklausur zur Vorlesung Grundlagen der Rechnerarchitektur
Universität Koblenz-Landau Montag, 6. Mai 2. Teilklausur zur Vorlesung Grundlagen der Rechnerarchitektur Sommersemester 2 Prof. Dr. Ch. Steigner Name Vorname Mat.-Nr. Studiengang Musterlösung Punkte :
MehrDatenpfad einer einfachen MIPS CPU
Datenpfad einer einfachen MIPS CPU Zugriff auf den Datenspeicher Grundlagen der Rechnerarchitektur Prozessor 19 Betrachten nun Load und Store Word Erinnerung, Instruktionen lw und sw sind vom I Typ Format:
Mehr2. Programmierung in C
2. Programmierung in C Inhalt: Überblick über Programmiersprachen, Allgemeines zur Sprache C C: Basisdatentypen, Variablen, Konstanten, Operatoren und Ausdrücke Anweisungen und Kontrollstrukturen (Steuerfluss)
Mehr4. Mikroprogrammierung (Firmware)
4. Mikroprogrammierung (Firmware) 4. Ein Mikroprogramm-gesteuerter Computer 4.2 Mikroprogramm-Beispiel: Multiplikation 4.3 Interpretation von Maschinenbefehlen durch ein Mikroprogramm 4. Mikroprogrammierung
MehrProgrammieren I. Kapitel 5. Kontrollfluss
Programmieren I Kapitel 5. Kontrollfluss Kapitel 5: Kontrollfluss Ziel: Komplexere Berechnungen im Methodenrumpf Ausdrücke und Anweisungen Fallunterscheidungen (if, switch) Wiederholte Ausführung (for,
MehrGI Vektoren
Vektoren Problem: Beispiel: viele Variablen vom gleichen Typ abspeichern Text ( = viele char-variablen), Ergebnisse einer Meßreihe ( = viele int-variablen) hierfür: Vektoren ( = Arrays = Feld ) = Ansammlung
Mehr1 Bedingte Anweisungen. 2 Vergleiche und logische Operatoren. 3 Fallunterscheidungen. 4 Zeichen und Zeichenketten. 5 Schleifen.
Themen der Übung Kontrollstrukturen, Pseudocode und Modulo-Rechnung CoMa-Übung III TU Berlin 9.10.01 1 Bedingte Anweisungen Vergleiche und logische Operatoren 3 Fallunterscheidungen 4 Zeichen und Zeichenketten
MehrDer Toy Rechner Ein einfacher Mikrorechner
Der Toy Rechner Ein einfacher Mikrorechner Dr. Gerald Heim Haid-und-Neu-Str. 10-14 76131 Karlsruhe 16. Mai 1995 Allgemeine Informationen 2 Quelle: Phil Kopmann, Microcoded versus Hard-Wired Logic, Byte
MehrZusammenfassung der Assemblerbefehle des 8051
Zusammenfassung der Assemblerbefehle des 8051 Seite 1 von 5 Befehl Bezeichnung Syntax Wirkung / Beispiel Befehle zum Datentransfer MOV Move MOV [Ziel],[Quelle] MOV P1,P3 Kopiert den Inhalt von P3 nach
MehrGrundlagen der Programmierung
Grundlagen der Programmierung 5. Vorlesung 06.11.2018 1 Zahlendarstellungen 2 Speicherinhalte: Bits Hardware Spannung Ladung Magnetisierung Codierung 0V ungeladen unmagnetisiert 0 5V geladen magnetisiert
MehrTeil 2: Rechnerorganisation
Teil 2: Rechnerorganisation Inhalt: Zahlendarstellungen Rechnerarithmetik schrittweiser Entwurf eines hypothetischen Prozessors mit Daten-, Adreß- und Kontrollpfad Speicherorganisation Mikroprogrammierung
MehrTechnische Informatik II Rechnerarchitektur
Technische Informatik II Rechnerarchitektur 3.Unterprogramme in MMIX Matthias Dräger E-Mail: www: mdraeger@mi.fu-berlin.de www.matthias-draeger.info/lehre/sose2010ti2/ tinyurl.com/sose2010ti2 Zuletzt bearbeitet:
MehrDieÜbersetzung funktionaler Programmiersprachen
DieÜbersetzung funktionaler Programmiersprachen 107 11 Die Sprache PuF Wir betrachten hier nur die Mini-Sprache PuF( Pure Functions ). Insbesondere verzichten wir(vorerst) auf: Seiteneffekte; Datenstrukturen;
MehrDLX Befehlsübersicht
DLX sübersicht 1 Instruktionen für den Daten-Transfer Daten können mit folgenden en zwischen Registern und dem Speicher oder zwischen Integer- und Fließkomma-Registern ausgetauscht werden. Der einzige
MehrSteuerwerk einer CPU. Einführung in die Technische Informatik Falko Dressler, Stefan Podlipnig Universität Innsbruck
Steuerwerk einer CPU Einführung in die Technische Informatik Falko Dressler, Stefan Podlipnig Universität Innsbruck Übersicht Implementierung des Datenpfads Direkte Implementierung Mikroprogrammierung
Mehr11. Unterprogrammtechnik
11 Unterprogrammtechnik 111 Sprung und Rücksprung 112 Retten der Register 113 Parameter-Übergabe Programmierkurs II Wolfgang Effelsberg 11 Unterprogrammtechnik 11-1 111 Sprung und Rücksprung BSR Verzweige
MehrMusterlösung zur Klausur
Koblenz am 25. Februar 25 Uhr c.t., Hörsaal MD 28 Studiengang Informatik/Computervisualistik Musterlösung zur Klausur TECHNISCHE INFORMATIK B Prof. Dr. Ch. Steigner Name: Vorname: Matrikel-Nr.: Vergessen
MehrProgrammieren 1 C Überblick
Programmieren C Überblick. Einleitung 2. Graphische Darstellung von Algorithmen 3. Syntax und Semantik 4. Einstieg in C: Einfache Sprachkonstrukte und allgemeiner Programmaufbau 5. Skalare Standarddatentypen
Mehr= 7 (In Binärdarstellung: = 0111; Unterlauf) = -8 (In Binärdarstellung: = 1000; Überlauf)
Musterlösung Übung 2 Aufgabe 1: Große Zahlen Das Ergebnis ist nicht immer richtig. Die Maschine erzeugt bei Zahlen, die zu groß sind um sie darstellen zu können einen Über- bzw. einen Unterlauf. Beispiele
MehrLösungsvorschlag zur 2. Übung
Prof. Frederik Armknecht Sascha Müller Daniel Mäurer Grundlagen der Informatik 3 Wintersemester 09/10 Lösungsvorschlag zur 2. Übung 1 Präsenzübungen 1.1 Schnelltest a) Der Instruktionssatz in der Assembler-Programmierung
MehrDaniel Betz Wintersemester 2011/12
Daniel Betz Wintersemester 2011/12 Digitally signed by daniel.betz@daniel-betz.com Date: 2011.12.04 17:24:40 +01'00' Insgesamt 16 Register von je 16 Bit (=WORD) Breite Untere 8 Register auch als 2 Register
MehrCarry Lookahead Adder
Carry Lookahead Adder Mittels der Generate und Propagate Ausdrücke lässt ich dann für jede Stelle i der Carry (Übertrag) für die Stelle i+1 definieren: Für einen 4 Stelligen Addierer ergibt sich damit:
MehrGrundlagen der Rechnerarchitektur. Einführung
Grundlagen der Rechnerarchitektur Einführung Unsere erste Amtshandlung: Wir schrauben einen Rechner auf Grundlagen der Rechnerarchitektur Einführung 2 Vorlesungsinhalte Binäre Arithmetik MIPS Assembler
MehrPC/XT/AT ASSEMBLER-BUCH
PC/XT/AT ASSEMBLER-BUCH Alle Befehle + Makro-Assembler KLAUS-DIETER THIES t
MehrInhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15
Vorwort... 15 1 Einstieg in die Welt von C 17 1.1 Die Sprache C... 17 1.2 Die C-Standardbibliothek... 18 1.3 Die nötigen Werkzeuge für C... 21 1.4 Übersetzen mit der Entwicklungsumgebung... 23 1.5 Übersetzen
MehrMehrdimensionale Arrays
Mehrdimensionale Arrays Prof. Dr.-Ing. Thomas Schwotzer 1 Einführung Eindimensionale Arrays haben wir bereits kennen gelernt. Es gibt aber auch mehrdimensionale Arrays. Die sind auch sehr notwendig, denken
MehrRechnerstrukturen 1: Der Sehr Einfache Computer
Inhaltsverzeichnis 1: Der Sehr Einfache Computer 1 Komponenten.................................... 1 Arbeitsweise..................................... 1 Instruktionen....................................
MehrAssembler - Adressierungsarten
Assembler - Adressierungsarten Dr.-Ing. Volkmar Sieh Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2008 Assembler - Adressierungsarten 1/31 2008-04-01
MehrJavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.
JavaScript JavaScript wird direkt in HTML-Dokumente eingebunden. Gib folgende Zeilen mit einem Texteditor (Notepad) ein: (Falls der Editor nicht gefunden wird, öffne im Browser eine Datei mit der Endung
MehrTechnische Informatik II Rechnerarchitektur
Technische Informatik II Rechnerarchitektur MMIX-Crashkurs Matthias Dräger, Markus Rudolph E-Mail: mdraeger@mi.fu-berlin.de rudolph@mi.fu-berlin.de www: tinyurl.com/mmix2010 www.matthias-draeger.info/lehre/sose2010ti2/mmix.php
Mehr