Wie zum ausführen von 64-bit-addition und Subtraktion mit MIPS?
Möchte ich ausführen von 64-bit-addition und Subtraktion:
v1v0(HiLo) = a1a0 + a3a2
mit MIPS assembly language (a1a0(HiLo)
ist der erste 64-bit-Zahl besteht aus zwei 32-bit zahlen, und a3a2(HiLo)
ist der zweite)
und ich haben:
$a0 = 0xffffffff
$a1 = 0x0
$a2 = 0x1
$a3 = 0x0
Ich bin ein Anfänger in MIPS, und ich bin mir nicht sicher, wie Sie Sie zu behandeln führt. Könnte mir jemand eine Lösung mit Erklärung?
Vielen Dank im Voraus! Dies ist der Befehlssatz, die ich verwende:
http://www.cs.uregina.ca/Links/class-info/201/SPIM-IO/MIPSrefCard.pdf
- Ich fand den Zusatz, aber nicht wissen, wie die Subtraktion funktioniert...
- Ich wäre schön, wenn Sie ausdrücklich, dass Sie wollen, eine Subtraktion
- warum mips64 - tag hier? In MIPS64 Ergänzungen und Subtraktionen sind von Natur aus in 64 bit, und Sie brauchen nichts besonderes zu tun, es
- stackoverflow.com/questions/1281806/...
- keine chance, du bist ein Hopkins-student?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Substrates eine Zahl, d.h.
v = a - b
ist dasselbe wie ein add mit eine negative Zahl ist, d.h.,v = a + (-b)
. Aber, in integer aritmetic, eine negative Zahl wird codiert als 2-Kompliment, das ist das gleiche wie 1-Kompliment + 1 und 1-Kompliment, das ist eine bitweise negation.In dieser Weise können wir schreiben, dass:
so, können wir schreiben dies in der Baugruppe (unter der Annahme b1 = a3 und b0 = a2):
mit Ihren Ideen, die, ich glaube, Sie würden Ihre eigene Frage zu beantworten:
sub64: subu $v0, $a0, $a2 # $v0 = $a0 - $a2 sltu $v1, $v0, $a2 # $v1 = ($v0 < $a2)? 1:0(subtract 1 if there's a borrow for Lo words) addu $a3, $a3, $v1 # $a3 = $a3 + $v1 subu $v1, $a1, $a3 # $v1 = $a1 - $a3 jr $ra
funktionieren sollte. Was denkst du?$a1 = 0, $a0 = 0x8000 0001, $a3 = 0, $a2 = 0x8000 0000
# your code here subu $v0, $a0, $a2 # $v0 = $a0 - $a2 sltu $v1, $a0, $a2 # $v1 = ($a0 < $a2)? 1:0(subtract 1 if there's a borrow for Lo words) addu $a3, $a3, $v1 # $a3 = $a3 + $v1 subu $v1, $a1, $a3 # $v1 = $a1 - $a3
$a1 = 0, $a0 = 0, $a3 = 0, $a2 = 1
sltu $t0, $v0, $a2
weil es scheint, dass Sie sind Einstellung$t0
willkürlich, basierend auf dem Wetter-die oberen Hälften der Parameter größer/kleiner als eine andere.sltu $t0, $v0, $a2
würde nicht erfassen, das carry-bitDie MIPS-Architektur nicht bieten eine carry-flag (noch andere Fahnen!). Nach diese Seite ein überlauf erfordern ein carry Auftritt, wenn das hinzufügen von zwei positiven zahlen gibt eine negative Zahl (oder Umgekehrt).
Etwas wie
bool carry = (a1[31] == a3[31]) && (v1[31] != a1[31])
übersetzt in MIPS assembly funktionieren sollte.sltu
.Im Allgemeinen müssen Sie genau das tun, was Sie gelernt haben, wie in der zweiten Klasse beim hinzufügen von multi-stellige zahlen. Fügen Sie jede "Spalte".
Die erste ist einfach, weil keine "Durchführung" geschieht. Im zweiten Fall mussten Sie tatsächlich fügen Sie 3 zahlen in der Zehner-Spalte: 8 + 3 + 1 (übertrag von Spalte). Dann die zweite Spalte auch getragen um 100.
Müssen Sie das gleiche zu tun, aber Sie werden das hinzufügen von 32-bits in jeder "Spalte". Zum Glück, da Sie Binär ist, können Sie tragen nur ein bit von der ersten Säule auf die zweite.
Den Algorithmus add64 werden sollte:
Wir überprüfen können, ob das tragen mit a0 + a2 > 2^32 - 1, aber denken Sie daran, dass in Binär:
2^n - 1 = a2 + ~a2 (ex: a2 = 0110, ~a2 = 1001, a2 + ~a2 = 1111 = 2^4 - 1, n=4)
Somit a0 + a2 > a2 + ~a2 => a0 > ~a2