分支目标地址公式上下文中的SignImm是什么?(顺便说一句)



我想知道以下公式中的SignImm是什么:

BTA = Branch Target Address = PC(old) + 4 + (SignImm << 2)

我读到它是旧PC+4和新目标地址之间的地址距离,但我没有在一个明确的例子中看到它。有人能举个例子给我解释一下吗?我感谢所有的帮助,我正在努力学习组装:(

0x00400000 addi $s0, $0, 4 # $s0 = 0 + 4 = 4
0x00400004 addi $s1, $0, 1 # $s1 = 0 + 1 = 1
0x00400008 sll $s1, $s1, 2 # $s1 = 1 << 2 = 4
0x0040000C bne $s0, $s1, target 
0x00400010 addi $s1, $s1, 1 # $s1 = 4 + 1 = 5
0x00400014 sub $s1, $s1, $s0 # $s1 = 5 – 4 = 1
. . . . . .
0x004000FC target:
add $s1, $s1, $s0 
BTA = PC + 4 + (SignImm << 2)
SignImm = (BTA-PC-4) >> 2
SignImm = (0x004000FC-0x0040000C-4) >> 2
SignImm = (0x000000F0-4) >> 2
SignImm = (0x000000EC) >> 2
SignImm = 0x0000003B = 59

所以在这个例子中,59应该是旧PC+4和目标之间的距离,但我在0x00400010上加了59,它不是0x004000FC。。。

所有指令都位于一个可被4整除的地址。
如果分支距离被编码为真正的字节距离,那么该数字的2个低位将始终为零。这是浪费。因此,编码使用双字-距离,从而使分支能够达到更远的4倍。

0x0040000C + 4 bytes + 0x3B dwords  
0x0040000C + 4 bytes + 0xEC bytes  
0x0040000C + 0x000000F0 bytes
0x004000FC

最新更新