2017-09-23 2 views
0

Angenommen, der aktuelle PC ist 0x00400010 (nach Inkrement) und das Ziellabel hat den Wert 0x00400040. Was ist der Binärwert der Konstante in der Anweisung?MIPS PC und Etikettenverfolgung

beq $s0, $s0, target 

Ich bin nicht wirklich sicher, wie man diese Frage angeht. Ich wäre dankbar für einen Hinweis oder eine Erklärung, wie man eine Lösung dafür finden kann.

+1

* Was ist der binäre Wert der Konstante in der Anweisung? * - Welche Konstante? – Marco

+0

Ich bin nicht sicher, was es bedeutet, wenn es nach dem binären Wert der Konstante fragt – Andre

+1

Könnten Sie bitte spezifischer sein, weil ich das Problem nicht verstehe, das Sie gegenüberstellen? Du verstehst nicht was "Beq" tut? Du verstehst nicht, was mit dem PC passiert? Was ist das Problem? – Marco

Antwort

1

Ich bin mir nicht sicher, ob ich Ihre Frage verstanden habe. Ich nehme an, dass Sie nach dem Offset fragen, der in der Anweisung kodiert wird.

Da das Ziel auf 0x00400040 und der aktuelle PC auf 0x00400010 liegt, ist der Offset wahrscheinlich 0x00000030 (weil 0x00400040 - 0x00400010 = 0x00000030). Dies kann leicht in das von Ihnen gewünschte Binärformat konvertiert werden:

0000 0000 0000 0000 0000 0000 0011 0000 

Aber bitte beachten Sie, dass ich MIPS nicht kenne. In einigen Prozessorarchitekturen, die in den Befehl codiert Offset ist

(target PC) - ((current PC) + (size of current instruction)) 

Da ich MIPS weiß es nicht, ich weiß nicht, was die Byte-Größe des beq Befehls ist. Daher kann ich den Offset für diesen Fall nicht berechnen. Wenn Sie mir die Größe der beq Anweisung mitteilen, werde ich diese Antwort bearbeiten und hinzufügen.

Außerdem sind in den meisten Prozessorarchitekturen relative Offsets für die meisten Befehle eingeschränkt. Noch einmal, ich kenne MIPS nicht, aber die Wahrscheinlichkeit ist, dass der Offset auf 16, 12 oder sogar 8 Bits begrenzt ist. Um in diesem Fall die tatsächliche binäre Offsetdarstellung zu erhalten, entferne Nullen von links von der oben angegebenen Binärzahl, bis nur noch die Bits übrig sind, die zum Speichern des Offsets verwendet werden.

EDIT (unter Berücksichtigung Busy Beaver Kommentar)

Auf MIPS, so scheint es, dass die Anweisungen auf 32 Bit/4 Byte ausgerichtet sind. Dies ermöglicht es, den tatsächlich benötigten Offset geteilt durch 4 zu speichern (die CPU liest dann den Offset und multipliziert ihn mit 4, um das tatsächliche Ziel zu berechnen). Der Vorteil ist, dass Sie mit den angegebenen Bits größere Offsets speichern können. Mit anderen Worten, Sie speichern 2 Offset-Bits auf diese Weise.

In Ihrem Beispiel sollte der PC um 0x00000030 Bytes springen, um zum Ziel zu gelangen. Der in der Anweisung gespeicherte Offset wäre dann 0x00000030/4, was dasselbe ist wie 0x00000030 >> 2, was 0x0000000C0 ist. Sie bat um die binäre Darstellung:

0000 0000 0000 0000 0000 0000 0000 1100 

Beim Dekodieren/Ausführen des Befehls, die CPU automatisch, dass von vier und auf diese Weise wird wieder die eigentliche Offset gewünschten Offset multipliziert.

+2

Mmh, ich glaube nicht, dass das passiert. 'beq $ s, $ t, offset' verzweigt, wenn die beiden Register gleich sind, und für den Fall, dass PC von' offset << 2 'vorrückt. Wenn also 'target'' 0x00400040' ist, dann wird nPC 'PC + (0x00400040) << 2' – Marco

+1

@BusyBeaver Danke für deinen Kommentar und +1. Wie gesagt, ich kenne MIPS nicht, aber offensichtlich müssen die Anweisungen dort auf 4 Bytes ausgerichtet sein. Ich werde meine Antwort entsprechend bearbeiten. – Binarus