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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage