Speichern von Werten in HALLO und LO-Register von MIPS
-
05-07-2019 - |
Frage
ich bestimmte Code in MIPS schreibe und ich habe bis zu dem Punkt kommen, wo die Anforderung ist das Ergebnis zu speichern, vorübergehend in HI
und LO
Spezialregister (beide sind 4 Byte breit). Diese Anweisungen sind zu meiner Verfügung:
divu s,t lo <-- s div t ; hi <-- s mod t
multu s,t hi / lo < -- s * t ;
Also, divu
speichert Ergebnis der Division in LO
und Rest in HI
, während multu
speichert die Multiplikation resultiert in LO
(unterem 4 Bytes) und HI
(höheres 4 Bytes).
Später abrufen resultieren aus HI
und LO
Register, ich kann:
mfhi $v0
mflo $v1
ich schon herausgefunden, wie Ergebnis einer Berechnung in LO
speichern:
ori $v0,$0,1 # Store result from $a0 into LO
divu $a0,$v0
- führen die
divu
speichert die Division in LO, so teile ich Ergebnis nur um 1 es dorthin zu gelangen.
jedoch in HI
Speicherung ist komplizierter. Eine Möglichkeit wäre, multu
Anweisung zu zwingen, um 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 soll (also wenn mein Wert ist 0100 1000
dann HI
0010 0100
enthält).
Wer weiß, wie etwas in HI
speichern registrieren?
Lösung
Ich möchte Nils Pipenbrinck Antwort erweitern:
Von MIPS32 arquitechture für Programmierer
mthi
Format: MIPS32 (MIPS I)
MTHI rs
Zweck: Um ein GPR an den Zweck HALLO Register zu kopieren
Description: HI ← rs
Der Inhalt des GPR rs geladen in spezielles Register HALLO.
Einschränkungen:
A berechnete Ergebnis geschrieben auf die HALLO / LO Paar von DIV, DIVU, MULT oder MULTU muss von MFHI oder MFLO gelesen werden entweder vor einem neuen Ergebnis kann in HALLO oder LO geschrieben werden. Wenn ein MTHI Anweisung folgt einer dieser arithmetischen Befehle ausgeführt, aber vor einem MFLO oder MFHI Unterricht, sind die Inhalte von LO UNVORHERSEHBAR. 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 Befehle ist MFHI, das Ergebnis dieser MFHI ist unberechenbar. Liest die HALLO oder LO spezielle Register muss von allen nachfolgenden Anweisungen getrennt werden, die durch zwei sie schreiben oder mehr Anweisungen. In MIPS IV und höher, einschließlich MIPS32 und MIPS64, gilt diese Einschränkung nicht.
mtlo
Format: MIPS32 (MIPS I)
MTLO rs
Zweck: Um ein GPR an den Zweck LO-Register zu kopieren Beschreibung:
LO ← rs
Der Inhalt von GPR rs wird in speziellen geladen LO registrieren.
Einschränkungen: Ein berechnetes Ergebnis geschrieben auf das HALLO / LO Paar von DIV, DIVU, MULT oder MULTU muss geschrieben werden entweder in HALLO oder LO durch MFHI oder MFLO vor einem neuen Ergebnis abgelesen werden.
Wenn ein MTLO Anweisung nach einer dieser arithmetischen Befehle ausgeführt wird, aber vor einem MFLO oder MFHI Anweisung, deren Inhalt HALLO sind unberechenbar. 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
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 Befehle ist MFHI, das Ergebnis dieser MFHI ist unberechenbar. Liest die HALLO oder LO spezielle Register muss von allen nachfolgenden Anweisungen getrennt werden, die durch zwei sie schreiben oder mehr Anweisungen. In MIPS IV und höher, einschließlich MIPS32 und MIPS64, gilt diese Einschränkung nicht.
Andere Tipps
Der MIPS-Befehlssatz hat ein Gegenstück für MFLO / MFHI.
Es ist MTLO / MTHI genannt 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: Stellen Sie sicher, dass der Prozessor Handbuch über die Latenzen und Gefahren, die mit dem LO / HALLO regs beteiligt zu überprüfen. Sie sind ganz besondere und Ihr Code, um Dinge wie wartet mindestens drei Zyklen zwischen einem Schreib- und einem Lese haben. Leider hängt dieses Verhalten ab, welche CPU Sie gerade arbeiten.
das falsch zu erhalten ist eine allgemeine Gefahr für angehende MIPS Programmierer :-)
Denken Sie darüber nach, was andere Extremwerte könnten interessante Ergebnisse, wenn als zweites Argument verwendet, um multu / divu (ich meine es absichtlich vage, weil dies wie eine Hausaufgabe Frage aussieht).