【问题标题】:Greater than, less than equal, greater than equal in MIPSMIPS 中的大于、小于等于、大于等于
【发布时间】:2013-03-03 07:13:34
【问题描述】:

给定两个寄存器$s0$s1,如何仅使用slt(设置为小于)和beqbne(如果相等,则为分支,如果不相等则分支)指令。

   if ($s0 > $s1) { goto label1 }
   if ($s0 >= $s1) { goto label2 }
   if ($s0 <= $s1) { go to label3 }

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    我假设伪代码是按顺序执行的,所以较早的条件为真意味着您去那里并且永远不会到达后面的if 语句。这使得最后一个分支保证在到达时被采用,所以它甚至不需要是有条件的。 (同时假设这是一个没有分支延迟槽的 MIPS。)

    slt  $t1,$s1,$s0      # checks if $s0 > $s1
    bne  $t1,$zero,label1 # if $s0 >  $s1, goes to label1
    beq  $s1,$s2,label2   # if $s0 == $s2, goes to label2 
    # beq  $t1,$zero,label3 # if $s0 <  $s1, goes to label3
    b    label3            # only possibility left
    

    如果不是这样,您需要将$s0 &gt;= $s1 实现为
    !($s0 &lt; $s1)slt $t1, $s0, $s1 / beqz $t1, target,例如,
    如艾哈迈德的回答所示。

    【讨论】:

    • 完全不适用于 MIPS。一方面,MIPS 没有标志寄存器。阅读它。
    • 当然适用。当然 MIPS 没有标志寄存器,但这无关紧要。如果 $s0 > $s1slt 会将值 1 放入 $t1
    • beq $t1,1, label1 应该是 bnez $t1, label1bne $t1, $zero, label1。没有带有常量操作数的 beq/bne 指令(除了零寄存器)。汇编器可能在幕后为您做一些工作。
    【解决方案2】:

    为了实现每个比较单独,而不是优化多个比较与早期的真实条件,使后面的不可达:

    slt $at, $s1, $s0           # $s0 > $s1  as ($s1 < $s0) != 0
    bne $at, $zero, label1
    
    slt $t0, $s0, $s1           # $s0 >= $s1 as (s0<s1) == 0
    beq $t0, $zero, label2
    
    slt $t1, $s1, $s0           # $s0 <= $s1 the same but reversing the inputs
    beq $t1, $zero, label3
    
    label1:
    label2:
    label3:
    

    相关:

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 2014-11-09
      • 2012-09-11
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多