【问题标题】:MIPS - How to find the address value of branch and jump instructionsMIPS - 如何找到分支和跳转指令的地址值
【发布时间】:2014-05-18 21:35:41
【问题描述】:

我马上就要考试了,我完全被这个问题困住了(见下文);即使查看模型答案也无济于事。我已经尝试阅读该主题的正文,但仍然不知道如何做到这一点。如果有人能提供该问题的分步说明,我将不胜感激。

"假设下面MIPS sn-p的第一条指令位于内存地址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

【问题讨论】:

  • 您需要提供问题的整个上下文,而不仅仅是 (f) 部分
  • @gilsho 问题的前面部分无关。
  • @OliCharlesworth 由于我的声誉低于 10,因此我无法嵌入图像 - 我现在已将代码包含在实际问题中。
  • 首先,您提供的代码中没有“bne”指令,其次,不清楚您所说的“其他值”是什么意思,是不是标签在内存中的地址,是它是从函数返回的值?

标签: mips addressing


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-09-17
    • 2016-07-26
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2018-10-05
    • 1970-01-01
    相关资源
    最近更新 更多