【问题标题】:16 bits hex range for mips assembly instruction beq and bnemips 汇编指令 beq 和 bne 的 16 位十六进制范围
【发布时间】:2014-03-04 04:13:00
【问题描述】:

我已经为 mips 汇编语言实现了 beq 指令。根据我对 beq 指令 (beq $s, $t, i) 的理解,我可以采用整数值或十六进制值。我已经建立了 16 位整数值的界限。我想知道 16 位十六进制值的界限是什么,所以当 i 太大(或太小?)时,它会在执行之前输出错误。以下是二进制的 beq 指令。

Branch On Equal
beq $s, $t, i
0001 00ss ssst tttt iiii iiii iiii iiii

我尝试过 (i > 0xffff),但似乎并未涵盖所有情况。我应该在这里做什么?谢谢。

【问题讨论】:

  • “似乎没有涵盖所有情况”到底是什么意思?
  • 它没有通过我教授的测试。我很确定它与那些 16 位十六进制的范围有关。
  • 我不清楚你到底想做什么。您正在编写 MIPS 仿真器吗?还是 MIPS 汇编器?无论哪种方式,偏移量都是有符号的,因此范围是 -32768..+32767,然后在添加到 PC 之前将乘以 4。
  • Michael 的评论意味着 +/- 32k 字。零 = 无偏移 (= nop),0xffff = -1 = 1 个字向后(分支到自身),...

标签: assembly hex mips


【解决方案1】:

对于hex(0 <= i <= 65535);,它应该在02^16 - 1 之间
对于int(-32768<=i<=32767),它应该在-2^152^15 - 1 之间

【讨论】:

    【解决方案2】:

    当您需要有条件地跳转到+- 2^15 条指令之外(字节偏移=二进制补码16位

    beq $s, $t,  target      # short jump, approx +- 2^17 bytes
    

    对比j uses pseudo-direct addressing,保留 PC 的前 4 位,替换其余的 26 位

    bne $s, $t,  .nojump
    j   target               # anywhere with the same top 4 bits
    .nojump:
    

    对比将地址放入寄存器并使用jr 到达任何 32 位地址:

    bne $s, $t,  .nojump
    lui  $t0,      %hi(target)
    ori  $t0, $t0, %lo(target)      # this is what  la $t0, target does.  It might use addui, but whatever
    jr   $t0
    .nojump:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-10
      • 2020-11-29
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 2012-01-09
      • 2021-06-12
      相关资源
      最近更新 更多