Jump-Anweisung in MIPS Assembly
Hier einige MIPS-Assembler-code schrieb ich zum testen der Sprung-Anweisung:
addi $a0, $0, 1
j next
next:
j skip1
add $a0, $a0, $a0
skip1:
j skip2:
add $a0, $a0, $a0
add $a0, $a0, $a0
skip2:
j skip3
loop:
add $a0, $a0, $a0
add $a0, $a0, $a0
add $a0, $a0, $a0
skip3:
j loop
Wenn ich den assembler, hier ist das Ergebnis:
[0x000000] 0x20040001 # addi $a0, $zero, 1 ($a0 = 1)
[0x000004] 0x08000002 # j 0x0002 (jump to addr 0x0008)
[0x000008] 0x08000004 # j 0x0004 (jump to addr 0x0010)
[0x00000C] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x000010] 0x08000007 # j 0x0007 (jump to addr 0x001C)
[0x000014] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x000018] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x00001C] 0x0800000B # j 0x000B (jump to addr 0x002C)
[0x000020] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x000024] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x000028] 0x00842020 # add $a0, $a0, $a0 ($a0 = $a0 + $a0)
[0x00002C] 0x08000008 # j 0x0008 (jump to addr 0x0020)
Blick auf den Maschinen-code für die jump-Anweisungen, das ist, was ich sehe:
1st jump (just jumps to next instruction) 0x08000002
2nd jump (skips 1 instruction) 0x08000004
3rd jump (skips 2 instructions) 0x08000007
4th jump (skips 3 instructions) 0x0800000B
5th jump (skips 3 instructions backwards) 0x08000008
Blick auf diese Anleitung, es sieht aus wie der Maschinen-code beginnt mit einem 08 für die jump-Anweisung, und die Zahl am Ende sagt die jump-Anweisung, wohin Sie gehen. Aber ich kann nicht herausfinden, wie diese Zahl berechnet wird. Auch, es ist nichts zu zeigen mir, dass der 5. Sprung rückwärts springen.
Wie ist den Sprung Wert berechnet?
- warum verwenden Sie 3
add $a0, $a0, $a0
? warum nicht verwendensll $a0, $a0, 3
- lassen Sie mich daran erinnern, dass Sie verdienen es, ein cookie für diese
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schauen Sie in ein Referenz-Handbuch für weitere details über die opcode Codierung.
Kurze version: In einem 32-bit-Anweisung können Sie keine 32-bit-Ziel springen. Der opcode verwendet 6 bits, die Blätter 26 bit für den Befehl. Die Ziel-Adresse wird konstruiert indem man die ersten 4 bits der Adresse der Instruktion nach der
j
Unterricht, dann 2 null-bits angehängt, den 26 bit aus dem jump-Anweisung Operanden. (Wie in der Anleitung von 32 bits, die Ausrichtung ist nützlich und ermöglicht das weglassen der letzten beiden 0 ist.)Backward jump: Die Adressen werden absolut und NICHT relativ, so hängt es nur von der Adresse des sprungbefehls, ob es ein vorwärts-oder rückwärts springen.
BEARBEITEN: genauere Beschreibung:
Wir haben unter der Adresse x jump-Anweisung j. Lassen Sie t stellen die Sprung-operand j. t ist 26 bit breit.
Die bit-Muster der Adresse der nächsten Anweisung wird wie folgt berechnet:
Also der Sprung ist IMMER absolute. Es gibt keine relativen Sprünge. wenn das Ergebnis kleiner ist als x, dann ist es eine rückwärts springen, wenn es größer ist, es ist ein vorwärts springen (und wenn Sie wollen, etwas dumm, machen Sie es gleich ;-).
Also schauen wir uns auf dem 5. Sprung von deinem Beispiel:
Den ersten 6 bits des Sprung-Ziel: 000000, weil die oberen 6 bits von der Adresse der Anweisung, die hinter dem Sprung ist 000000.
Den nächsten 26 bits der niedrigsten 26 bits der Anweisung springen, das ist 00000000000000000000001000
Die letzten 2 bits: 00, denn der bekam immer angehängt.
Haben wir gemeinsam: 0000000000000000000000000000100000, die hex-20. Und an dieser Adresse ist genau die Beschriftung/Anleitung, wo die Strömung sollte fortgesetzt werden.
In MIPS
J
ist ein J-Typ-Anleitung:So haben wir eine
target
ist 26 bit lang. Es wird in Kombination mit der PC der next-Anweisung, wie folgt:Es ist 2 bits nach Links verschoben, da MIPS Instruktionen (ignoriert die MIPS16-Erweiterung) sind 32-bit lang, das heißt, Sie beginnen alle in einer Adresse, deren untere 2 bits sind null.