Donc, nous étudions l'architecture MIPS à l'école et nous implémentons une architecture MIPS32. Je pensais utiliser GNU cross-binutils en tant qu'assembleur, mais je deviens bizarre en traitant les instructions jal, j et jr. L'assembleur semble insérer les instructions aux mauvais endroits. Je ne sais pas pourquoi cela se produit, et je doute que l'assembleur MIPS soit aussi cassé, alors je suppose que c'est supposé arriver.Comportement étrange de l'assembleur MIPS avec instructions de saut (et de liaison)
Voici mon fichier de montage factice:
.section .text
.globl __start
__start:
addi $a0, $0, 100
addi $a1, $0, 200
jal test
test:
add $v0, $a0, $a1
jr $ra
Cependant, quand je démonte je reçois cette sortie:
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
...
Est-ce une bizarrerie architecturale? Si oui, quelle en est la raison?
EDIT: Testé en ajoutant quelques NOP est juste pour le diable ...
.section .text
.globl __start
__start:
addi $a0, $0, 100
addi $a1, $0, 200
nop
jal test
test:
add $v0, $a0, $a1
nop
jr $ra
et il me donne quelque chose qui semble un peu correct.
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
Pourquoi jal et j échangent-ils des places avec la dernière instruction?
On dirait un problème de endian à l'intérieur du compilateur (ou le désassembleur), juste sur la couche de commande au lieu de la couche d'octets ... étrange ... – schnaader