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 Arithmetik mit Zuweisung C Programm: f = (g + h) (i + j); MIPS Instruktionen (verwende temporäre Variablen t0 und t1): Grundlagen der Rechnerarchitektur Assembler 10
Die Operanden sind Register Voriges Beispiel: Komplexere Arithmetik mit Zuweisung C Programm: f = (g + h) (i + j); Sei hierbei: g in Register $s1 gespeichert h in Register $s2 gespeichert i in Register $s3 gespeichert j in Register $s4 gespeichert f in Register $s0 gespeichert MIPS Instruktionen (verwende temporäre Register $t0 und $t1): add $t0, $s1, $s2 # t0=g+h add $t1, $s3, $s4 # t1=i+j sub $s0, $t0, $t1 # f=t0-t1 MIPS Registergröße = 32 Bit Assembler Syntax: Das Zeichen # leitet für den Rest der Zeile einen Kommentar ein. Der Text wird vom Assembler einfach ignoriert. Grundlagen der Rechnerarchitektur Assembler 11
Speicher Operanden C Programm: g = h + A[8]; MIPS Instruktionen (verwende temporäres Register $t0): Sei hierbei: g in Register $s1 gespeichert h in Register $s2 gespeichert Basisadresse von A in Register $s3 Bildquelle: David A. Patterson und John L. Hennessy, Computer Organization and Design, Fourth Edition, 2012 Grundlagen der Rechnerarchitektur Assembler 12
Alignment Restriction Zugriff auf A[8], wenn Basisadresse von A in Register $s3 gespeichert? Bildquelle: David A. Patterson und John L. Hennessy, Computer Organization and Design, Fourth Edition, 2012 Grundlagen der Rechnerarchitektur Assembler 13
Laden und Speichern C Programm: A[12] = h + A[8]; MIPS Instruktionen (verwende temporäre Register $t0): Sei hierbei: Basisadresse von A in Register $s3 und h in Register $s2 gespeichert Grundlagen der Rechnerarchitektur Assembler 14
Laden und Speichern von Bytes C Programm: A[12] = h + A[8]; MIPS Instruktionen (verwende temporäre Register $t0): Sei hierbei: Basisadresse von A in Register $s3 h in Register $s2 gespeichert Sei A[8] = 01110010. Was passiert im obigen Beispiel bei lb mit $t0 genau? $t0 MSB LSB Sei A[8] = 11110010. Was passiert im obigen Beispiel bei lb mit $t0 genau? $t0 MSB LSB Grundlagen der Rechnerarchitektur Assembler 15
Weitere Befehle zum Laden und Speichern Laden von Byte ohne Sign Extension: lbu { Beispiel: lbu $t0, 27($s3) } Was passiert im obigen Beispiel mit $t0, wenn 27($s3) = 11001000? $t0 MSB LSB Laden von Halfword mit Sign Extension: lh { Beispiel: lh $t0, 22($s3) } Laden von Halfword ohne Sign Extension: lhu { Beispiel: lhu $t0, 22($s3) } Speichern von Halfword: sh { Beispiel: sh $t0, 22($s3) } Grundlagen der Rechnerarchitektur Assembler 16
Addieren und Laden von Konstanten C Programm: x = x + 4; MIPS Instruktion: Sei hierbei: x in Register $s3 gespeichert MIPS erlaubt negative Konstanten und braucht damit kein subi. MIPS hat ein spezielles Register $zero, welches 0 hart verdrahtet speichert. C Programm: x = 42; MIPS Instruktion: Sei hierbei: x in Register $s3 gespeichert Grundlagen der Rechnerarchitektur Assembler 17
Zwischenbilanz der MIPS Architektur Memory CPU Arithmetic Unit Registers $0... $31 Name Nummer Verwendung $zero 0 Konstante 0 $at 1 $v0 $v1 2 3 $a0 $a3 4 7 $t0 $t7 8 15 Temporäre Register $s0 $s7 16 23 saved temporäre Reg. $t8 $t9 24 25 Temporäre Register $k0 $k1 26 27 $gp 28 $sp 29 $fp 30 $ra 31 Grundlagen der Rechnerarchitektur Assembler 18
Arithmetik Laden Speichern Zusammenfassung der behandelten Instruktionen Instruktion add rd, rs, rt addi rt, rs, imm sub rd, rs, rt lb rt, address lbu rt, address lh rt, address lhu rt, address lw rt, address sb rt, address sh rt, address sw rt, address Bedeutung Register rd = Register rs + Register rt Register rt = Register rs + Konstante imm Register rd = Register rs Register rt Lade Byte an der Adresse address in Register rt. Das Byte ist sign extended. Lade Byte an der Adresse address in Register rt. Lade Half Word an der Adresse address in Register rt. Das Half Word ist sign extended. Lade Half Word an der Adresse address in Register rt. Lade Word an der Adresse address in Register rt. Speichere unterstes Byte des Registers rt an Adresse address Speichere unteres Half Word des Registers rt an Adresse address Speichere Inhalt des Registers rt an Adresse address. Grundlagen der Rechnerarchitektur Assembler 19
Quiz addi $s0, $zero, 4 # lw $s1, 0($s0) # lw $s2, 4($s0) # add $s1, $s1, $s1 # add $s1, $s1, $s2 # addi $s1, $s1, 1 # sw $s1, 0($s0) # Inhalt (Word) Inhalt (Word) Adresse 12 33 8 4 4 12 0 421 Speicher zu Beginn Adresse 12 8 4 0 Speicher nach Instruktionsdurchlauf Grundlagen der Rechnerarchitektur Assembler 20
Darstellung von Instruktionen Grundlagen der Rechnerarchitektur Assembler 21
Übersetzung aus Assembler in Maschinensprache Assembler Instruktion add $t0, $s1, $s2 0 17 18 8 0 32 6 Bit Opcode Maschinen Instruktion 5 Bit Source1 5 Bit Source2 5 Bit Dest 5 Bit Shamt 6 Bit Funct 00000010001100100100000000100000 Name Nr $s0 16 $s1 17 $s2 18 $s3 19 $s4 20 $s5 21 $s6 22 $s7 23 Name Nr $t0 8 $t1 9 $t2 10 $t3 11 $t4 12 $t5 13 $t6 14 $t7 15 Grundlagen der Rechnerarchitektur Assembler 22
Notwendigkeit für andere Instruktionsformate add $t0, $s1, $s2 op rs rt rd shamt funct 6 Bit 5 Bit 5 Bit 5 Bit 5 Bit 6 Bit R Typ? lw $t0, 32($s3) I Typ Opcode 6 Bit Source 5 Bit Dest 5 Bit Konstante oder Adresse 16 Bit Grundlagen der Rechnerarchitektur Assembler 23
Zwischenbilanz Instruktion Format op rs rt rd shamt funct add R 0 reg reg reg 0 32 sub R 0 reg reg reg 0 34 addi (immediate) I 8 reg reg constant lw (load word) I 35 reg reg offset sw (store word) I 43 reg reg offset 6 Bit 5 Bit 5 Bit 5 Bit 5 Bit 6 Bit 16 Bit Grundlagen der Rechnerarchitektur Assembler 24
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 op rs rt rd shamt funct add R 0 reg reg reg 0 32 lw (load word) I 35 reg reg offset sw (store word) I 43 reg reg offset Name Nr $s0 16 $s1 17 $s2 18 $s3 19 $s4 20 $s5 21 $s6 22 $s7 23 Name Nr $t0 8 $t1 9 $t2 10 $t3 11 $t4 12 $t5 13 $t6 14 $t7 15 Grundlagen der Rechnerarchitektur Assembler 25
Logische Operationen Grundlagen der Rechnerarchitektur Assembler 26
Logischer Links und Rechts Shift Erinnerung: Logischer Shift. Beispiel: Links Shift um 4 Stellen Rechts Shift um 4 Stellen MIPS Shift Instruktionen sll und srl, sllv, srlv: sll $t2,$s0,4 # $t2 = $s0 << 4 Bits srl $t2,$s0,7 # $t2 = $s0 >> 7 Bits sllv $t2,$s0,$s1 # $t2 = $s0 << $s1 Bits srlv $t2,$s0,$s1 # $t2 = $s0 >> $s1 Bits Beispiel: Maschineninstruktion für obige sll Assembler Instruktion: 0 0 16 10 4 0 6 Bit Opcode 5 Bit Source1 5 Bit Source2 5 Bit Dest 5 Bit Shamt 5 Bit Funct R Typ Grundlagen der Rechnerarchitektur Assembler 27
Arithmetischer Rechts Shift Erinnerung: Arithmetischer Rechts Shift. Beispiel mit 8 Bit: 0011 0000 1101 0111 Rechts Shift um 4 Stellen Rechts Shift um 3 Stellen Arithmetischer Rechts Shift in MIPS: sra $t2,$s0,4 # $t2 = $s0 arithmetisch # um 4 Bits geshiftet srav $t2,$s0,$s1 # $t2 = $s0 arithmetisch # um $s1 Bits geshiftet Grundlagen der Rechnerarchitektur Assembler 28
AND, OR, NOR und XOR Erinnerung: AND. Erinnerung: OR. Erinnerung NOR. Erinnerung XOR. MIPS Instruktionen (R Typ), Beispiel: and $t0,$t1,$t2 # $t0 = $t1 AND $t2 or $t0,$t1,$t2 # $t0 = $t1 OR $t2 nor $t0,$t1,$t2 # $t0 = $t1 NOR $t2 xor $t0,$t1,$t2 # $t0 = $t1 XOR $t2 MIPS Instruktionen (I Typ), Beispiel: andi $t0,$t1,0111 # $t0 = $t1 AND 0111 ori $t0,$t1,1100 # $t0 = $t1 OR 1100 xori $t0,$t1,1100 # $t0 = $t1 XOR 1100 Grundlagen der Rechnerarchitektur Assembler 29
Es gibt gar kein NOT?! Erinnerung NOT (auf Folie zu Zweierkomplement kurz eingeführt): Beobachtung: Wie kann man also NOT($t0) in MIPS realisieren? Grundlagen der Rechnerarchitektur Assembler 30
Zusammenfassung der behandelten Instruktionen Shift Logische Verknüpfung Instruktion sll rd, rs, shamt sllv rd, rt, rs srl rd, rs, shamt srlv rd, rt, rs sra rd, rs, shamt srav rd, rt, rs and rd, rs, rt or rd, rs, rt nor rd, rs, rt xor rd, rs, rt andi rt, rs, imm ori rt, rs, imm xori rt, rs, imm Bedeutung Register rd = Register rs logisch links um den Wert shamt geshiftet. Register rd = Register rs logisch links um den in Register rs gespeicherten Wert geshiftet. Register rd = Register rs logisch rechts um den Wert shamt geshiftet. Register rd = Register rs logisch rechts um den in Register rs gespeicherten Wert geshiftet. Register rd = Register rs arithmetisch rechts um den Wert shamt geshiftet. Register rd = Register rs arithmetisch rechts um den in Register rs gespeicherten Wert geshiftet. Register rd = Register rs AND Register rt. Register rd = Register rs AND Register rt. Register rd = Register rs AND Register rt. Register rd = Register rsand Register rt. Register rt = Register rs AND Konstante imm Register rt = Register rs AND Konstante imm Register rt = Register rs AND Konstante imm Grundlagen der Rechnerarchitektur Assembler 31
Schwieriges Quiz MIPS Assemblercode um folgende Funktion zu berechnen: $s1 = die ersten 8 Bits von 4 * NOT($s1 AND $s2) Tipp: wir brauchen and, nor und sll Grundlagen der Rechnerarchitektur Assembler 32