MIPS 汇编中带有嵌套 If 的 If-Else

If-Else with nested If in MIPS assembly

我正在尝试编写代码,不断从用户那里获取整数并将最小值存储到 $s2 中。

这是我正在尝试做的事情的 C 代码表示

if ( $s2 == 0 )
    $s2 = $t0
else {
    if ( $t0 < $s2 )
    $s2 = $t0
}

基本上,我在输入循环之外用零加载了 $s2。这将检查 $s2 是否为零,并将其设置为当前(第一个)用户输入($t0),因为这是最小值。如果 $s2 不再包含零,则它会根据 $s2 中已有的内容检查新用户输入,如果小于则成为新的最小值。

如何在 MIPS 汇编中实现它?

到目前为止我已经有了这个(这是一个叫做 read 的循环的结束部分)但是它所做的只是当我按下第一个 int 时,它跳到最后并打印 min 而没有循环。

read:
    ...

    beq         $s2, $zero, LOAD    

    slt     $s6, $t0, $s2
    bne     $s6, $zero, LOAD

    j       read

LOAD:

    li      $s2, 0
    addu        $s2, $s2, $t0

主要问题是您需要在代码底部跳转,因为您[可能] "falling off the edge of the world":

 read:
    ...

    beq     $s2,$zero,LOAD

    slt     $s6,$t0,$s2
    bne     $s6,$zero,LOAD

    j       read

LOAD:

    # NOTE: you could use $zero as you did above to eliminate the "li" here
    li      $s2,0
    addu    $s2,$s2,$t0

    # NOTE/BUG: need to jump back to read loop
    j       read

代码可以缩短一点。

  1. slt(对比 sltu)我们知道这些值是 signed。因此,如果我们用最大正值(即 0x7FFFFFFF)而不是零预填充 $s0,我们可以从循环中删除第一个 beq
  2. 此外,如果我们在slt之后反转分支的意义,我们可以消除额外的j指令。
  3. 我们可以将 addu 更改为使用 $zero 并删除 li

    li      $s2,0x7FFFFFFF          # load maximum positive value

read:
    ...

    slt     $s6,$t0,$s2             # is new value < minimum?
    beq     $s6,$zero,read          # if no, loop

    addu    $s2,$zero,$t0           # save new minimum value
    j       read                    # restart input loop