Addieren und Laden von Konstanten Grundlagen der Rechnerarchitektur ‐ Assembler 17 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:
31
Embed
03 MIPS-Assembler - userpages.uni-koblenz.deunikorn/lehre/gdra/ss18/03 MIPS... · MIPS unterstützt mit einem separaten FPU‐Coprozessor Gleitkommaarithmetik auf Zahlen im IEEE...
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Addieren und Laden von Konstanten
Grundlagen der Rechnerarchitektur ‐ Assembler 17
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.
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
sh rt, address Speichere unteres Half‐Word des Registers rt an Adresse address
sw rt, address Speichere Inhalt des Registers rt an Adresse address.
MIPS‐Assemblercode um folgende Funktion zu berechnen:
$s1 = die ersten 8 Bits von 4 * NOT($s1 AND $s2)
Schwieriges Quiz
Grundlagen der Rechnerarchitektur ‐ Assembler 32
Tipp: wir brauchen and, nor und sll
Weitere Arithmetik
Grundlagen der Rechnerarchitektur ‐ Assembler 33
Die speziellen Register lo und hi
Grundlagen der Rechnerarchitektur ‐ Assembler 34
Erinnerung: ganzzahliges Produkt von zwei n‐Bit‐Zahlen benötigt bis zu 2n Bits.
Eine MIPS‐Instruktion zur ganzzahligen Multiplikation von zwei Registern der Länge 32‐Bits benötigt damit ein Register der Länge 64 Bit, um das Ergebnis abzuspeichern.
MIPS hat für die ganzzahlige Multiplikation zwei spezielle Register, lound hi, in denen das Ergebnis abgespeichert wird:
lo : Low‐Order‐Word des Produktshi : Hi‐Order‐Word des Produkts.
Zugriff auf lo und hi erfolgt mittels mflo und mfhi. Beispiel:mflo $s1 # lade Inhalt von lo nach $s1mfhi $s2 # lade Inhalt von hi nach $s2
# lo speichert den Quotienten# hi speichert den Rest
Register hi und lo können auch beschrieben werden. Beispiel:mtlo $s1 # Lade Inhalt von $s1 nach lomthi $s2 # Lade Inhalt von $s2 nach hi
Das ist sinnvoll für madd und msub. Beispiele:madd $s1,$s2 # (hi,lo)=(hi,lo)+$s1*$s2msub $s1,$s2 # (hi,lo)=(hi,lo)-$s1*$s2
Ganzzahlige Multiplikation ohne hi und lo
Grundlagen der Rechnerarchitektur ‐ Assembler 36
Es gibt eine weitere Instruktion, zur Multiplikation, die kein hi und loverwendet:
mul $s1, $s2, $s3 # $s1 = die low-order 32# Bits des Produkts von# $s2 und $s3.
Zwischenbilanz der MIPS‐Architektur
Grundlagen der Rechnerarchitektur ‐ Assembler 37
CPU
$0...
$31
ArithmeticUnit
MultiplyDivide
Registers
Lo Hi
Memory
Neu
Die speziellen Register $f01 bis $f31
Grundlagen der Rechnerarchitektur ‐ Assembler 38
MIPS unterstützt mit einem separaten FPU‐Coprozessor Gleitkommaarithmetik auf Zahlen im IEEE 754‐Single‐Precision (32‐Bit) und Double‐Precision‐Format (64 Bit).
Die MIPS‐Floating‐Point‐Befehle nutzen die speziellen 32‐Bit‐Floating‐Point‐Register (die Register des FPU‐Coprozessors):$f0, $f1, $f3, ..., $f31
Single‐Precision‐Zahlen können in jedem der Register gespeichert werden (also $f0, $f1, ..., $f31).
Double‐Precision‐Zahlen können nur in Paaren von aufeinander folgenden Registern ($f0,$f1), ($f2,$3), ..., ($f30,$f31) gespeichert werden. Zugriff erfolgt immer über die geradzahligen Register (also $f0, $f2, ..., $f30).
Floating‐Point‐Befehle
Grundlagen der Rechnerarchitektur ‐ Assembler 39
Laden/speichern von Daten in die Register $f0,...,$f31 am Beispiel:mtc1 $s1,$f3 # $f3 = $s1mfc1 $s1,$f3 # $s1 = $f3lwc1 $f3,8($s1) # $f3 = Memory[8+$s1]ldc1 $f2,8($s1) # ($f2,$f3) = Memory[8+$s1]swc1 $f3,8($s1) # Memory[8+$s1] = $f3sdc1 $f2,8($s1) # Memory[8+$s1] = ($f2,$f3)
Verschieben von Registerinhalten von $f0,...,$f31 am Beispiel:mov.s $f6,$f3 # $f6 = $f3mov.d $s4,$f6 # ($f4,$f5) = ($f6,$f7)
Ein Label (oder Sprungmarke zu deutsch) ist eine mit einem Namen markierte Stelle im Code, an die man per Branchbzw. Jump hin springen möchte.Assembler‐Syntax: „Name des Labels“ gefolgt von einem „:“.