总的来说,我正在研究处理器中的流水线技术,下面是一个示例代码,它按顺序强制两个指令之间的数据依赖关系,我想看看汇编代码中是否有任何后果。
int func(int a, int b, int c, int d){
a += b;
d += a + c;
return d;
}
使用(gcc 4.8.5)进行编译和反汇编:
mips-sde-elf-gcc -O1 -o func func.c -c && mips-sde-elf-objdump -S func
这是输出:
00000000 <func>:
0: 00852021 addu a0,a0,a1
4: 00861021 addu v0,a0,a2
8: 03e00008 jr ra
c: 00471021 addu v0,v0,a3
问题:为什么在计算并将最终结果放入返回寄存器之前会有跳转返回指令?这是一种聪明的流水线使用还是输出不是真实的情况,因为没有链接到最终的可执行文件?
答案 0 :(得分:3)
在MIPS上,(几乎)总是执行分支指令后的指令,这是设计的,因为它意味着可以更有效地利用流水线。
原因是当执行分支指令时,已经取出并解码后的指令,但此时尚未取出分支目标处的指令。