Was ist die "Beziehung" zwischen addi und subi?
Ich soll diese Frage beantworten. Nach etwas recherche sagt, dass add und sub haben die gleichen opcode und unterscheiden sich nur in den funktionalen Bereich. Ist das die Antwort oder etwas anderes?
Update
Gibt es auch in der Nios II CPU-Handbuch:
subi
subtract immediate
Operation: rB ← rA – σ (IMMED)
Assembler Syntax: subi rB, rA, IMMED
Example: subi r8, r8, 4
Description: Sign-extends the immediate value IMMED to 32 bits, subtracts it from the value of rA and then
stores the result in rB.
Usage: The maximum allowed value of IMMED is 32768. The minimum allowed value is
–32767.
Pseudo-instruction:
© March 2009
subi is implemented as addi rB, rA, -IMMED
InformationsquelleAutor Niklas Rosencrantz | 2012-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht bewusst, dass MIPS auch hat eine richtige
subi
Anleitung (obwohl einige Umgebungen zu implementieren, die ein makro dafür).Da Sie subtrahieren einer unmittelbaren Wert, Sie können einfach die negation von es zu der
addi
Anleitung:Unmittelbarer operand ist ein Zweierkomplement-Wert, was bedeutet, es ist perfekt in der Lage, eine negative Zahl und die Art, wie das Zweierkomplement funktioniert bedeutet, dass Sie können eine negative Zahl in eine unsigned Art und Weise und das gibt das gleiche Ergebnis wie subtrahieren (da Sie wrap-around).
Beispielsweise
-42
im 16-bit-Zweierkomplement ist der Wert ohne Vorzeichen65494
. Wenn Sie hinzufügen50
und65494
umwickeln auf 65536, Sie am Ende mit:subi
ich habe aktualisiert die Frage, und Sie können sehen, wie der Unterricht ist entsprechend der Bedienungsanleitung.Eher einige Monteure hätten es als eine pseudo-Anweisung eher als eine source-level-makro. MIPS-Assembler in der Regel eine Menge von pseudo-Anweisungen; und es gibt sogar ein register, die im Allgemeinen reserviert für temporäre Nutzung durch die pseudo-Anweisungen. (z.B. bei vergleichen-und-Zweig). Und der manuelle Eintrag in der Frage update beschreibt es als eine pseudo-Anweisung.
InformationsquelleAutor paxdiablo
Auf die hardware - /Maschinen-code-Ebene von ISA design, MIPS nicht
subi
/subiu
Unterricht. Das macht Sinn, weil " MIPS nicht über ein FLAGS-register.Gibt es keine carry-flag, die aufzeichnen würde der Unterschied zwischen dem hinzufügen eines negativen oder Subtraktion positiv, wie es auf vielen anderen Architekturen (x86, ARM, und viele andere, weniger RISCy-Architekturen). So verbringen Sie einen extra opcode (und der transistoren zu entschlüsseln) keinen Sinn macht.
Hinzufügen eines negierten sofort ändert nichts an der unterzeichnet-überlauf-Erkennung von
addi
/subi
. Sie erhalten signed-überlauf beim hinzufügen von zwei zahlen mit dem gleichen Vorzeichen und das Ergebnis hat das entgegengesetzte Vorzeichen. Oder, wenn die Subtraktionz = x - y
, wenn x und y haben entgegengesetzte Zeichen, und diez
undx
haben entgegengesetzten Vorzeichen, Subtraktion überlauf (wo Sie wollensubi
zu Falle.)y
ist die unmittelbare, also die Umsetzung alsz = x + y_negated
machtaddi
's überlauf-Erkennung arbeiten.Natürlich der Regel Sie (oder ein C-compiler) würde halt
addiu
/subiu
weil Sie nicht wollen, zu Falle, und Sie würden sich lieber die wrap-around, wie die signed-überlauf-Verhaltens, es sei denn, Sie wurden mit-fsanitize=undefined-behavior
oder so etwas.An der asm source-level, es kann implementiert werden als eine pseudo-Anweisung für die Bequemlichkeit, wie dein Zitat aus dem NIOS II-Handbuch zeigt. (Oder sogar als ein makro, die auf Monteure, die keine Unterstützung für die pseudo-Anweisung.)
Nur dann, wenn eine hardware -
subi
/subiu
speichern würde, eine Instruktion ist, wenn Sie hinzufügen wollte32768
/subtrahieren-32678
. (Beachten Sie die NIOS II-Handbuch darauf hin, dasssubi
unterstützt immediates in der-32767 .. 32768
Bereich, gegenüber der normalen signed 16-bit 2er Komplement-32768 .. 32767
)Den meisten-negative Zahl im 2-Komplement ist eine Anomalie, und die negativen dauert ein bisschen, um richtig darstellen. also
-(0x8000)
überläufe zu0x8000
im 16-bit immediate. Jeder vernünftige assembler implementiertsubi
als eine pseudo-Anweisung sollte warnen oder warnen mit einem sofortigen außerhalb der unterzeichnet-16-bit-Bereich füraddi
/addiu
.addiu
- Zeichen-erstreckt sich seine sofort auf 32 bit, das gleiche wieaddi
. Die "unsigned" ist irreführend. Warum würden wir addiu statt addi?. Signed und unsigned sind die gleichen binäre operation für 2-Komplement-Maschinen. Die Benennung der Art der Spiele-C-signed-überlauf wird ein Undefiniertes Verhalten, aber beachten Sie, dass undefiniert, nicht erfordern Faltenbildung. Denkenaddi
als überlauf-geprüft, unterzeichnet hinaus, und nur verwenden, wenn Sie speziell möchten.Fun fact:
ori
und anderen booleans tun, null-erweitern Ihre unmittelbaren, soli $t0, val
erweitern können, um nur eine einzige Instruktion fürval = -32768 .. 65535
mit entwederaddiu $t0, $zero, signed_int16
oderori $t0, $zero, uint16
.InformationsquelleAutor Peter Cordes
Stimmen mit den oben. Erläutern, auf einige Umgebungen. Streckte die kleine Wahrheit, die ich gesehen habe, auf die Angelegenheit. Entwickeln meiner eigenen (Verschwörung) Theorie.
Ist das Stichwort dort unten, vorletzte Zeile (3., einschließlich copyright)- eine pseudo-Instruktion. Dies ist immer eine gemeinsame Klasse Frage, und so Ihren Wert deutlich machen. Einige Emulatoren (Looking at you Mars), behandeln Sie es wie ein echter Unterricht, während andere (qtspim - schade!) nicht einmal die Mühe, um es zu kompilieren.
Während ich habe nie gefunden, ein gutes Beispiel, angeblich sein, dass es zu einfach zu konvertieren von einem zum anderen, so ist es redundant. Und Sie versuchten zu Folgen "einfachen design-Prinzipien". Mir, das bricht ein wenig, denn es gibt viele pseudoinstructions bereits vertreten, dass einfache Bearbeitungen der anderen Befehle. Der Zweig pseudo-Anweisungen Gliedern sich in 2 Befehle, und diese würde 2 oder sogar 3 Befehle. So, dieses ist nicht anders. Und was ist mit Dingen wie "li". Ich meine, come on, das ist nur addiu. Sonst nichts. Wenn Sie hinzufügen, dass, es gibt ernsthaft keine Entschuldigung. Ehrlich gesagt, ich denke, es wäre einfacher, um es für Einfachheit und Symmetrie Willen. Aber dann, was passieren würde, jedermanns Lieblings-MIPS-Prüfung Frage?
- Und das ist der eigentliche Grund, warum es nicht SUBI. Für die schwerfälligen alten ASM-Programmierer, um die Schraube mit Studenten.
addiu
(es sei denn, Sie wollte subtrahieren-32768
sondern kann nur hinzufügen, dass32767
).Was genau Sie fordern, ist die Verschwörung? Die fehlende hardware
subi
? Oder das fehlen einersubi
pseudo-Instruktion, die in einigen Assemblern? Ich habe nur versucht, dem MARS, und es werden dortsubi $t1, $t2, 1234
zwei Anweisungen: Erstens erzeugen die Konstante in$at
($1
), dann einsub
Anweisung (das ist natürlich eine echte Anleitung). Also der MARS ist dumm, und nicht nur negieren, die sofort für eineaddi
. Aber es funktioniert nur dieser mit "extended pseudo-Anweisungen" aktiviert ist, nicht pseudo-basic-Anweisungen, dass die meisten Monteure unterstützen. Das ist, warum es strahlt so ineffizienten code.InformationsquelleAutor Andy T