Frage

Ich lerne Computer-Arithmetik. Das Buch, das ich verwenden (Patterson und Hennessey) listet die Frage unten.

  

Code über Mips doppelt führen   Präzisions integer Subtraktion für   64-Bit-Daten. Angenommen, der erste Operand   in den Registern sein $ t4 (hallo) und   $ T5 (lo), an zweiter Stelle in $ t6 (hallo) und   $ T7 (lo).

Meine Lösung auf die Antwort ist

sub  $t3, $t5, $t7   # Subtract lo parts of operands. t3 = t5 - t7
sltu $t2, $t5, $t7   # If the lo part of the 1st operand is less than the 2nd,
                     #   it means a borrow must be made from the hi part
add  $t6, $t6, $t2   # Simulate the borrow of the msb-of-low from lsb-of-high
sub  $t2, $t4, $t6   # Subtract the hi's. t2 = t4 - t6

Doch der Autor gegebenen Lösungen für dieses Problem sind wie unten

Für unterzeichnet mit doppelter Genauigkeit Zahlen,

subu $t3, $t5, $t7   
sltu $t2, $t5, $t7  
add  $t6, $t6, $t2
sub  $t2, $t4, $t6

Für unsigned double precision Zahlen,

subu $t3, $t5, $t7   
sltu $t2, $t5, $t7  
addu $t6, $t6, $t2
subu $t2, $t4, $t6

Mein Verständnis für die Unterschiede in der Bedienung von sub/add und subu/addu ist, dass Überlauf-Ausnahme in sub/add erzeugt wird und nicht in subu/addu. Sowohl sub/add und subu/addu subtrahieren / fügen Sie die Bits der Operanden und die Interpretation der Operanden unterzeichnet werden oder ohne Vorzeichen macht keinen Unterschied zu dem Ergebnis, anders als in slt und sltu Anweisungen.

Frage 1
Ich bin Folgern vom Autor gegebenen Lösungen, die Überlauferkennung behandelt wird, während ich nicht die gleiche in meine Lösung dachte. Habe ich recht? Gibt es eine andere Sache, die ich fehle?

Frage 2
Unter der Annahme, dass meine obige Schlussfolgerung richtig ist, warum ist Überlauf-Erkennung für den Autor selbst Lösungen im Falle der Subtraktion von unsigned doppelter Genauigkeit durch die Verwendung von addu und subu ausgeschaltet?

War es hilfreich?

Lösung

Für Addition und Subtraktion, gibt es keinen Unterschied zwischen mit und ohne Vorzeichen Operanden, mit Ausnahme des Begriff des Überlaufes. Ein Überlauf ist, was passiert, wenn der Zahlenwert des Ergebnisses nicht die Interpretation der Folge von Bits überein, dass Sie erhalten.

Betrachten wir zum Beispiel 8-Bit-Sequenzen (MIPS 32-Bit-Register, aber 8 Bit sind einfacher für meine Beispiele). Lassen Sie uns nicht signierte Interpretation annehmen: eine 8-Bit-Sequenz darstellt, einen numerischen Wert zwischen 0 und 255 (einschließlich). Wenn ich auf 01110110 (Zahlenwert 118) 10010011 (Zahlenwert 147) fügen Sie dann erhalte ich 00001001 (Zahlenwert 9). 9 ist nicht gleich 147 + 118. Ich bekomme dieses Ergebnis, weil der mathematische Wert 265 ist, was nicht in 8 Bits passen. Das Additionsergebnis würde 9 Bits, die erforderlich sind, aber die obere neunte Bit fallen gelassen wurde.

Nun, stellen Sie sich das gleiche Beispiel mit der unterzeichnet Interpretation. 10010011 hat jetzt numerischen Wert -109. 01110110 noch Zahlenwert 118, und das erhaltene Ergebnis (00001001) hat den Wert 9. Die mathematische Summe von -109 und 118 aufweist 9 ist, so gibt es keinen Überlauf.

Das bedeutet, dass der Begriff des Überlaufes hängt davon ab, wie Sie die Werte interpretieren. Die Additions Mechanik ist die gleiche für beide mit und ohne Vorzeichen Interpretationen (für die gleichen Eingangssequenzen von Bits, können Sie die gleiche Ausgangs-Bit-Sequenz erhalten - das ist der springende Punkt ist die Verwendung von Zweier-Komplement für negative Werte mit Vorzeichen) unterscheidet sie aber Überlauf Handhabung <. / p>

Die MIPS-Architektur stellt Mittel für Ausnahmen bei Überlauf auslösen. Konzeptionell gibt es drei möglich Additionsoperationen auf 32-Bit-Worten:

  • eine Zugabe, die geräuschlos Ignoriert Überläufe (Ergebnis abgeschnitten wird)
  • ein Zusatz, der eine Ausnahme auslöst, wenn ein Überlauf auftritt signierter (es gibt einen Überlauf, wenn die Eingangs- und Ausgangssequenzen werden als vorzeichenbehaftete Zahlen interpretiert)
  • ein Zusatz, der eine Ausnahme auslöst, wenn ein Überlauf auftritt unsigned (es gibt einen Überlauf, wenn die intput und Ausgangssequenzen als Zahlen ohne Vorzeichen interpretiert werden)

Die MIPS Geräte die ersten zwei Arten von Zusätzen, mit jeweils dem addu und add Opcodes. In den MIPS-Dokumentationen, werden sie genannt, bzw. unsigned und unterzeichnet arithmetics . Es gibt keine Opcode für Ausnahmen auf unsigned Überlauf zu erhöhen. In der Praxis verwenden C-Compiler nur addu, aber sie können add für signierte Typen verwenden (dies wird durch den C-Standard erlaubt ist, würden aber eine Menge von vorhandenen Code brechen). Ada-Compiler verwenden add weil Ada macht Überlauf Überprüfung obligatorisch.

That being said ...

Patterson und Hennessey wollen und ohne Vorzeichen arithmetics auf 64-Bit-Integer implementieren. Für unsigned arithmetics, wollen sie keine Ausnahme auch immer, damit sie addu und subu verwenden. Für unterzeichnet arithmetics, wollen sie eine Ausnahme auftreten, wenn das mathematische Ergebnis nicht auf 64-Bit Sequenz mit unterzeichnet Interpretation passen würde. Sie wollen nicht wegen einiger Fehlüberlauf ähnlichen Zustand eine Ausnahme zu erhöhen, wenn die Verarbeitung der unteren 32-Bit-Hälften. Aus diesem Grunde ist sie eine subu für die niedrigen Teile verwendet werden.

Ihre Lösung ist falsch, weil es eine Ausnahme auslösen kann, wo es nicht sollte. Angenommen, Sie 2000000000 (zwei Milliarden) subtrahieren wollen von -2000000000 (minus zwei Milliarden). Das mathematische Ergebnis ist 4000000000 (vier Milliarden). Die zwei Operanden und das Ergebnis passen sicher in 64 Bits (der darstellbare Bereich -9223372036854775808 bis 9223372036854775807). Daher ist für 64-Bit unterzeichnet arithmetics, gibt es keinen Überlauf: Es sollte keine Ausnahme sein. Doch in dieser Situation Ihr erstes sub einen Überlauf berichten. Das sub arbeitet mit 32-Bit-Werte und unterzeichnet 32-Bit arithmetics. Sein operands wird 01110111001101011001010000000000 und 10001000110010100110110000000000. Hinweis, dass diese Werte beide passen in 32 Bits: die 32-Bit-signierte Interpretation dieser Werte sind jeweils plus und minus zwei Milliarden. Das Subtraktionsergebnis ist jedoch vier Milliarden, und sie paßt nicht 32 Bit (als Zahl mit Vorzeichen). So Ihre sub löst eine Ausnahme aus.

Als Faustregel gilt: Überlauf-Erkennung geht es um Dinge zu tun, die auf Signedness Interpretation ab, die Auswirkungen der Handhabung des höchstwertigen Bits. Für große Integer-Arithmetik, alle Wörter mit Ausnahme der höchstwertigen gelten als unsigned behandelt werden, damit addu / subu überall. Als erster Schritt sind, die Dinge einfacher zu verstehen, wenn Sie zuerst konzentrieren sich auf unsigned arithmetics, ohne Ausnahme (dann verwenden Sie nur addu und subu und nie add oder sub).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top