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