所以,我们正在学校学习 MIPS 架构,我们正在实现 MIPS32 架构。我以为我会使用 GNU cross-binutils 作为汇编程序,但是在处理指令 jal、j 和 jr 时我得到了奇怪的输出。汇编器似乎在错误的地方插入了指令。我不知道为什么会发生这种情况,而且我怀疑 MIPS 汇编器会那么坏,所以我认为这应该会发生。
这是我的虚拟程序集文件:
.section .text
.globl __start
__start:
addi $a0, $0, 100
addi $a1, $0, 200
jal test
test:
add $v0, $a0, $a1
jr $ra
然而,当我反汇编我得到这个输出:
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
...
这是一些建筑怪癖吗?如果是这样,这背后的理由是什么?
编辑:测试添加一些 nop 只是为了见鬼......
.section .text
.globl __start
__start:
addi $a0, $0, 100
addi $a1, $0, 200
nop
jal test
test:
add $v0, $a0, $a1
nop
jr $ra
它给了我一些似乎有些正确的东西。
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
为什么 jal 和 j 与最后一条指令交换位置?