我正在尝试编写一些不断从用户那里获取整数的东西,并将最小值存储到$ 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
答案 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
代码可以缩短一点。
slt
(与sltu
对比)我们知道值已签名。因此,如果我们使用最大正值(即$s0
)预填0x7FFFFFFF
而不是零,我们可以从循环中删除第一个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