If-Else与嵌套If在MIPS程序集中

时间:2016-10-20 20:27:10

标签: if-statement assembly mips

我正在尝试编写一些不断从用户那里获取整数的东西,并将最小值存储到$ 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

1 个答案:

答案 0 :(得分:0)

主要问题是你需要在代码底部跳转,因为你[可能]“脱离了世界的边缘”:

 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对比)我们知道值已签名。因此,如果我们使用最大正值(即$s0)预填0x7FFFFFFF而不是零,我们可以从循环中删除第一个beq
  2. 另外,如果我们在slt之后反转分支的意义,我们可以删除额外的j指令。
  3. 我们可以将addu更改为使用$zero并删除li
  4.     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