Weird MIPS Assembler Verhalten mit Sprung (und Link) Anweisung
So studieren wir MIPS-Architektur in der Schule und implementieren eine MIPS32-Architektur. Ich dachte, ich würde GNU Cross-Binutils als Assembler verwenden, aber ich bekomme seltsame Ausgaben, wenn ich mich mit jal, j und jr befasse. Der Assembler scheint die Anweisungen an der falschen Stelle einzufügen. Ich habe keine Ahnung, warum dies passiert, und ich bezweifle, dass der MIPS-Assembler so kaputt wäre. Deshalb gehe ich davon aus, dass dies passieren soll.
Hier ist meine Dummy-Assembly-Datei:
.section .text
.globl __start
__start:
addi $a0, $0, 100
addi $a1, $0, 200
jal test
test:
add $v0, $a0, $a1
jr $ra
Beim Zerlegen erhalte ich jedoch die folgende Ausgabe:
Disassembly of section .text:
00000000 <__start>:
0: 20040064 addi a0,zero,100
4: 0c000003 jal c <test> <--- Why is jal coming before addi?
8: 200500c8 addi a1,zero,200
0000000c <test>:
c: 03e00008 jr ra <--- Why is jr coming before add?
10: 00851020 add v0,a0,a1
...
Ist das eine architektonische Eigenheit? Wenn ja, welche Gründe stecken dahinter?
EDIT: Getestet, einige Nopps nur zum Teufel hinzuzufügen ...
.section .text
.globl __start
__start:
addi $a0, $0, 100
addi $a1, $0, 200
nop
jal test
test:
add $v0, $a0, $a1
nop
jr $ra
und es gibt mir etwas, das etwas richtig scheint.
Disassembly of section .text:
00000000 <__start>:
0: 20040064 addi a0,zero,100
4: 200500c8 addi a1,zero,200
8: 0c000004 jal 10 <test>
c: 00000000 nop
00000010 <test>:
10: 00851020 add v0,a0,a1
14: 03e00008 jr ra
18: 00000000 nop
1c: 00000000 nop
Warum tauschen jal und j die Plätze mit der letzten Anweisung aus?