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?

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top