MIPS - 如何查找分支和跳转指令的地址值

时间:2014-05-18 21:35:42

标签: mips addressing

我的考试即将开始,我完全坚持这个问题(见下文);即使看模型答案也无济于事。我已经尝试阅读我们的主题文本,但仍然不知道如何做到这一点。如果有人能够逐步解决这个问题,我将非常感激。

  

"假设下面MIPS片段的第一条指令位于内存地址0x10001000。在bne和j指令中else和exit的值是什么?"

1   0x10001000:   addi $s0, $0, 5
2   0x10001004:   sub $s2, $0, $s1
3   0x10001008:   beq $s0, $s2, else
4   0x1000100C:   add $s0, $0, $0
5   0x10001010:   add $t0, $s2, $s0
6   0x10001014:   j exit
7   0x10001018:   else: addi $s1, $s0, -1
8   0x1000101C:   exit:
     

模特答案:

Else: 0000000000000011 Exit: 00000000000000010000000111

我也包含了原始问题图片的链接。 http://i.imgur.com/NgHpZXs.png

1 个答案:

答案 0 :(得分:5)

首先,我们将处理分支机构。分支是I-Type指令,因此分支目标以16位编码。找出分支的立即字段的最简单方法是计算分支指令与其目标之间的指令数。在这种情况下,else标签是4之后的beq指令,但是,PC在指令获取阶段会增加4,因此实际的立即字段实际上是3。当然,在二进制文件中,这与样本0000000000000011匹配。

接下来,跳转是J-Type指令,它使用其地址的第一个24位对跳转目标进行编码。但是,因为跳转目标必须是字对齐的,所以最后两位始终为0,这使得它们不必要。因此,j指令的跳转字段与示例答案匹配:0x1000101C >> 2 = 0x4000407 = 00000000000000010000000111