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
代码可以缩短一点。
- 从
slt
(对比 sltu
)我们知道这些值是 signed。因此,如果我们用最大正值(即 0x7FFFFFFF
)而不是零预填充 $s0
,我们可以从循环中删除第一个 beq
。
- 此外,如果我们在
slt
之后反转分支的意义,我们可以消除额外的j
指令。
- 我们可以将
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
我正在尝试编写代码,不断从用户那里获取整数并将最小值存储到 $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
代码可以缩短一点。
- 从
slt
(对比sltu
)我们知道这些值是 signed。因此,如果我们用最大正值(即0x7FFFFFFF
)而不是零预填充$s0
,我们可以从循环中删除第一个beq
。 - 此外,如果我们在
slt
之后反转分支的意义,我们可以消除额外的j
指令。 - 我们可以将
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