【问题标题】:what happens if the destination address j jumps to is an immediate value?如果目标地址 j 跳转到的是立即数,会发生什么?
【发布时间】:2020-08-21 14:47:28
【问题描述】:
3. Mr.Noob is pondering about this strange line of MIPS instruction in his program:
beq $t3, $t9, 0 #0 is the immediate value
Which of the following statements is TRUE?
A. That instruction is an “infinite loop”.
B. That instruction can be removed from the program with NO impact on execution
result.
C. That instruction is equivalent to a branch‐lesser‐or‐equal (ble).
D. That instruction jumps to the instruction at instruction address 0.
E. None of the above.

我能问为什么答案是 B 吗?谢谢。

【问题讨论】:

    标签: mips instruction-set


    【解决方案1】:

    beq 指令是一个 I-Type,这意味着该指令的一部分编码一个 16 位有符号立即数。该指令是条件分支。该指令的立即数用作所采用的分支目标。如果条件是:

    • false,则pc := pc + 4 是它执行的操作(进入下一条指令)。由于没有采用分支,因此这会像任何其他指令一样以顺序方式推进 pc,例如 add

    • true,则进行分支,操作为pc := pc + 4 + sxt32(imm16)*4,将控制权转移到目标,通常是汇编语言中的标签。但是,由于立即数为零,因此该等式的计算结果为pc := pc + 4 + sxt32(0)*4,即pc := pc + 4 + 0 -或- pc := pc + 4

    因此,无论条件为真还是假,无论是否采用分支,都具有仅将pc前进1条指令的效果。

    使用标签而不是立即数:

        beq $t3, $t9, next
    next:
        ...
    

    这也会在机器码中为beq 生成立即值 0。

    如果被占用的beq 的立即数是-1,那么它会分支到自身,这将导致无限循环。如果立即数为 -2,则向后分支 1 条指令;如果立即数为 0,则继续执行下一条指令;如果立即数为 1,则分支跳过一条指令。

    删除指令将减少代码大小并可以提高性能,但不会影响程序的逻辑——假设程序不依赖于代码大小或位置。

    让我们注意,使用带有立即数的分支的代码往往取决于位置,如果您删除一条指令,您可能必须修复这些分支——这就是我们使用标签来代替的原因,让汇编程序计算正确的立即数 (所以我们可以随意添加和删除指令,只需重新组装)。

    【讨论】:

    • 分支延迟槽呢?
    • 分支延迟槽已经消失了一段时间,但如果您使用的是原始 MIPS,那就是一个问题。
    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2023-01-19
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多