2009-05-05 20 views
4

Ich schreibe bestimmten Code in MIPS und ich bin an den Punkt gekommen, wo das Ergebnis vorübergehend in HI und LO spezielle Register gespeichert werden soll (beide sind 4 Byte breit)). Diese Anweisungen sind zu meiner Verfügung:Speichern von Werten in HI und LO-Registern von MIPS

divu  s,t lo <-- s div t ; hi <-- s mod t 
multu s,t hi/lo < -- s * t ; 

So divu speichert Ergebnis der Division in LO und Rest in HI, während multu speichert Ergebnis der Multiplikation in LO (unteres 4 Bytes) und HI (höhere 4 Byte).

Später resultieren aus HI und LO Register abrufen, ich kann:

mfhi $v0 
mflo $v1 

ich schon herausgefunden, wie in LO Ergebnis einer Berechnung zu speichern:

ori  $v0,$0,1   # Store result from $a0 into LO 
divu $a0,$v0 
  • die divu speichert das Ergebnis der Division in LO, also teile ich das Ergebnis einfach durch 1, um es dort zu erhalten.

Speichern in HI ist jedoch komplizierter. Eine Möglichkeit wäre, multu Anweisung zu zwingen, den Wert von 32 Bits zu verschieben (4 Byte):

multu $a0,0x80000000  # Shift $a0 by 32 bits and store into HI/LO 

Aber ist das Ergebnis, dass der Wert in HI 1 Bit rechts von wo es sein sollte (so, wenn mein Wert ist 0100 1000 dann HI enthält 0010 0100).

Kann jemand etwas in HI Register speichern?

+0

* 32 Bit (8 Byte) *. uh, 32b ist 4 Bytes, nicht 8. auf 32-Bit MIPS, HI und LO sind jeweils 4 Bytes. Es ist die 64-Bit-Verkettung des Paares, die 8 Bytes ist (die nicht in ein einzelnes Register passt). –

Antwort

7

Ich möchte Nils Pipenbrinck Antwort erweitern: für Programmierer

Von MIPS32 arquitechture

mthi

Format: MIPS32 (MIPS I)

MTHI rs 

Zweck: Um ein GPR an den Zweck zu kopieren HALLO registrieren

Description: HI ← rs 

Der Inhalt GPR rs geladen in spezielles Register HALLO.

Beschränkungen:

Ein berechnetes Ergebnis an das/LO Paar HALLO geschrieben von DIV, DIVU, MULT oder MULTU muß von MFHI oder MFLO bevor ein neuen Ergebnis gelesen werden können, entweder in HALLO oder LO geschrieben werden. Wenn ein MTHI-Befehl nach einem dieser arithmetischen Befehle ausgeführt wird, aber vor einem MFLO- oder MFHI -Befehl, ist der Inhalt von LO UNPREDICTABLE. Das folgende Beispiel zeigt diese illegale Situation:

MUL  r2,r4 # start operation that will eventually write to HI,LO 
...    # code not containing mfhi or mflo 
MTHI  r6 
...    # code not containing mflo 
        # this mflo would get an UNPREDICTABLE value 
MFLO  r3 

Historische Informationen:

In MIPS I-III, wenn eine der beiden vorhergehenden Anweisungen ist MFHI, das Ergebnis dieser MFHI ist unberechenbar. Lesevorgänge des Sonderregisters HI oder LO müssen von allen nachfolgenden Anweisungen getrennt werden, die durch zwei oder mehr Anweisungen in diese Zeichen geschrieben werden. In MIPS IV und höher, einschließlich MIPS32 und MIPS64, existiert diese Einschränkung nicht.

mtlo

Format: MIPS32 (MIPS I)

MTLO rs 

Zweck: Um ein GPR an den Zweck zu kopieren LO Beschreibung registrieren:

LO ← rs 

Den Inhalt GPR rs werden in das spezielle Register LO geladen. Einschränkungen: Einschränkungen: Ein durch DIV, DIVU, MULT oder MULTU in das HI/LO-Paar geschriebenes Ergebnis muss von MFHI oder MFLO gelesen werden, bevor ein neues Ergebnis in HI oder LO geschrieben werden kann.

Wenn ein MTLO-Befehl nach einer dieser arithmetischen Anweisungen, aber vor einem MFLO- oder MFHI-Befehl ausgeführt wird, ist der Inhalt von HI UNPREDICTABLE. Das folgende Beispiel diese illegale Situation zeigt:

MUL  r2,r4 # start operation that will eventually write to HI,LO 
...    # code not containing mfhi or mflo 
MTLO  r6 
...    # code not containing mfhi 
        # this mfhi would get an UNPREDICTABLE value 
MFHI  r3 

Historische Informationen:

In MIPS I-III, wenn eine der beiden vorhergehenden Anweisungen ist MFHI, das Ergebnis dieser MFHI ist unberechenbar. Lesevorgänge des Sonderregisters HI oder LO müssen von allen nachfolgenden Anweisungen getrennt werden, die durch zwei oder mehr Anweisungen in diese Zeichen geschrieben werden. In MIPS IV und höher, einschließlich MIPS32 und MIPS64, existiert diese Einschränkung nicht.

+0

Danke für der zusätzliche Aufwand. –

1

Denken Sie darüber nach, welche anderen Extremwerte zu interessanten Ergebnissen führen könnten, wenn sie als zweites Argument für Multi/Divu verwendet werden (ich bin absichtlich vage, weil das wie eine Hausaufgabenfrage aussieht).

+0

Denken Sie nicht, dass die Verwendung von Multi - und Divu ist möglich, Werte in HI/LO - Register zu speichern, da jeder Befehl alle Register vollständig überschreibt, wenn nicht mit größter Sorgfalt genommen :(Damn MIPS. –

6

Das MIPS-Befehlssatz hat ein Pendant für MFLO/MFHI.

Es heißt MTLO/MTHI und tut genau das, was Sie wollen:

mtlo $v0 # moves the contents of v0 into the lo-register 
    mthi $v1 # moves the contents of v1 into the hi-register 

Diese Anweisungen sind selten und oft nicht in zusammengefasst Befehlssatz Referenzen.

Btw: Überprüfen Sie die Bedienungsanleitung des Prozessors auf die Latenzen und Gefahren, die mit den LO/HI-Registern verbunden sind. Sie sind sehr speziell und Ihr Code kann Dinge wie warten mindestens drei Zyklen zwischen einem Schreiben und Lesen haben. Leider hängt dieses Verhalten davon ab, an welcher CPU Sie gerade arbeiten.

das falsch zu erhalten ist eine allgemeine Gefahr für angehende MIPS Programmierer :-)

+0

Danke, das ist etwas, was ich übersehen. –