15 Stimmen

Warum ergeben MIPS-Operationen auf vorzeichenlosen Zahlen vorzeichenbehaftete Ergebnisse?

Wenn ich versuche, mit vorzeichenlosen Ganzzahlen in MIPS zu arbeiten, bleibt das Ergebnis jeder Operation, die ich ausführe, vorzeichenbehaftet (d.h. die Ganzzahlen sind alle im 2er-Komplement), obwohl jede Operation, die ich ausführe, eine vorzeichenlose ist: addu , multu und so vierte...

Wenn ich Zahlen aus dem Bereich [2^31, 2^32 - 1] Ich erhalte ihren "übergelaufenen" negativen Wert, als ob sie vorzeichenbehaftet wären (was sie wohl auch sind).

Aber wenn ich so etwas versuche:

li $v0, 1
li $a0, 2147483648                # or any bigger number
syscall

die gedruckte Nummer ist immer 2147483647 (2^31 - 1)

Ich bin verwirrt... Was übersehe ich?

PS: Ich habe meinen Code nicht beigefügt, da er nicht sehr lesbar ist (so ist Assembler-Code) und abgesehen von diesem Problem, scheint er gut zu funktionieren. Wenn jemand meint, dass es notwendig ist, werde ich es sofort einfügen!

23voto

Pedro Silva Punkte 4602

Von Wikipedia :

Der MIPS32-Befehlssatz besagt, dass das Wort "unsigned" als Teil von Additions- und Subtraktionsbefehlen eine falsche Bezeichnung ist. Der Unterschied zwischen vorzeichenbehafteten und vorzeichenlosen Versionen von Befehlen besteht nicht in der Vorzeichenerweiterung (oder deren Fehlen) der Operanden, sondern steuert, ob bei einem Überlauf ein Trap ausgeführt wird (z. B. Add) oder ein Überlauf ignoriert wird (Add unsigned) . Der unmittelbare Operand CONST dieser Befehle ist immer vorzeichenerweitert.

Von der MIPS-Befehlsreferenz :

ALLE arithmetischen Immediate-Werte sind vorzeichenerweitert [...] Der einzige Unterschied zwischen vorzeichenbehafteten und vorzeichenlosen Befehlen besteht darin, dass vorzeichenbehaftete Befehle eine Überlaufausnahme erzeugen können, vorzeichenlose Befehle jedoch nicht.

0 Stimmen

Ich habe im ganzen Netz nach einer Antwort gesucht... überall, nur nicht im Offensichtlichen. Danke!

0 Stimmen

Warum wird dann die Terminologie "signiert und unsigniert" verwendet und nicht etwa "geprüft und nicht geprüft"?

1 Stimmen

Das ist eine falsche Bezeichnung. Lesen Sie das erste Zitat.

2voto

John Knoeller Punkte 32285

Es sieht für mich so aus, als ob das eigentliche Problem der Syscall ist, den Sie zum Drucken von Zahlen verwenden. Er scheint das, was Sie übergeben, immer als vorzeichenbehaftet zu interpretieren, und möglicherweise auch als gebunden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X