我正在编写单周期MIPS CPU,我很困惑如何计算分支地址。给出这个MIPS数据路径图
为什么在符号延伸并向左移2后,地址由PC + 4添加?
我的主要问题是当我做
时','
我会被一条指令拒之门外。看看我写的MIPS程序集Fibonacci测试用例:
SignExtImm(instruction.imm) << 2 + (PC + 4)
说我在[0x004000a0] 0x00112020 add $4, $0, $17 <-- # loop label here
[0x004000a4] 0x0c100002 jal 0x00400008 [fib]
[0x004000a8] 0x00000000 nop
[0x004000ac] 0x00029821 addu $19, $0, $2
[0x004000b0] 0x22310001 addi $17, $17, 1
[0x004000b4] 0x1632fffb bne $17, $18, -20 [loop-0x004000b4];
[0x004000b8] 0x00000000 nop
并且分支被带走了
说明为0x004000b4
所以0x1632fffb
和imm val := 0xFFFB
sign extend imm val ==&gt; PC+4 := 0x004000B8
向左移动2 ==&gt; 0xFFFFFFFB
然后0xFFFFFFEC
+ 0xFFFFFFEC
==&gt; 0x004000B8
==&gt; 0x1004000A4
但我的循环从0x004000A4
如果我遵循MIPS数据路径图,我无法计算正确的分支地址。