【问题标题】:Finding offset from a code snippet从代码片段中查找偏移量
【发布时间】:2011-11-08 09:19:46
【问题描述】:

我对以下问题有点坚持,

考虑以下 MIPS 代码并回答以下问题。

addi $t1, $s0, 400
loop: lw $s1, 0($s0)
add $s2, $s2, $s1
lw $s1, 4($s0)
add $s2, $s2, $s1
addi $s0, $s0, 8
bne $t1, $s0, loop

标签循环在条件分支中翻译成什么值 指令?

现在我知道了分支目标地址的数学公式。但是这里没有完成内存寻址,所以我通过计算目标地址和 PC 之间的行来找出偏移量。这给出的答案是 7(字偏移)。我对这种方法是否正确?

【问题讨论】:

  • 真的吗?选择弗拉基米尔的答案?难以置信...
  • @m0skit0:是的,你们俩的答案都是正确的。他也提到了 PC+4。
  • 我在他之前回答了,而且更详细。无论如何np。

标签: mips computer-architecture mips32


【解决方案1】:

对 MARS 模拟器 http://courses.missouristate.edu/KenVollmar/MARS/download.htm 的快速实验给了我答案 -6,-5 表示行数差异,另一个 -1 因为 PC 在指令后增加了 1。

【讨论】:

    【解决方案2】:

    AFAIK,恐怕不是。

    正如 MIPS 指令参考所说:

    18 位有符号偏移(16 位偏移字段左移 2 位) 被添加到分支之后的指令的地址(不是 分支本身),在分支延迟槽中,形成一个 PC 相对 有效的目标地址。

    据我了解,从分支指令到loop 标签的距离是负数(因为标签在分支之前,因此地址较低)。距离以字数计算(因此左移 2 位)。由于所有 MIPS 指令都是 4 字节,这将是 6 条指令之前,因此 -6 是应该出现在分支指令偏移量(低半字)中的值。二进制:1111 1111 1111 1010(二进制补码)。十六进制:FFFA。

    用模拟器检查,似乎我的推理是正确的,因为指令编码为 0x1530FFFA。

    【讨论】:

    • 你更快,只是更正,4字节,而不是位是编码指令的宽度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2017-02-07
    • 2011-09-11
    相关资源
    最近更新 更多