MIPS存储位混淆,

时间:2014-09-15 00:45:21

标签: binary mips machine-language

嗨我试图将一点存入临时。寄存器。我这样做是否正确?虽然我在它,我试图看到有多少1是十进制数字的二进制形式(0-16)我这样做对吗?这是重要的代码块,其余的工作正常(只是输出和不是)

# for (i = 0; i <= 16; i++)
li $s0, 0 # i = 0

li $s3, 0 #constant zero

li $s4, 0 #i-2=0

bgt $s0, 16, bottom
top:
# calculate n from i
# Your part starts here

sb $t1, ($s0) #store LSB from number i in t1

sltu $t7,$s3,$t1 # check if t1 is a 1, if it is set t7 = 1

add $s1 ,$s3,$t1 # add 1 to n

ble $s4, 7, bloop # loop through rest of bits

bloop:

srl $t7, $s0, 1  # move bits in i right one, bringing in a zero from the left

sltu $t6, $s3, $t7 # check if t7 is a 1, if it is set t6 to 1

add $s1, $t6, $s1  # add increment n up 1

bgt $s4, 7, continue # break out of loop

continue:

1 个答案:

答案 0 :(得分:1)

让我们看看你的代码:

    li $s0, 0
    li $s3, 0
    li $s4, 0

这些说明将3个寄存器$s0$s3$s4设置为0

    bgt $s0, 16, bottom

如果bottom大于16,则分支到$s0。现在$s0最初为0,并且之前没有标记,所以&# 39;没办法回到这里,所以这个分支永远不会被带走。此外,它甚至无法组装,因为您从未在任何地方定义bottom标签。

top:

标签top,因此您可以作为循环返回到此处 - 但您的代码没有top的分支,因此它实际上永远不会。

    sb $t1, ($s0)

$t1的字节存储在$s0给出的地址处。现在第一次进入循环,$t0从未被设置为任何东西,那么你存储的是什么?更糟糕的是,$s0已设置为0,因此您将在地址0处存储,这将崩溃(给出运行时错误)。

所以这个商店真的没有意义。它将垃圾存储到无效的地址。

    sltu $t7,$s3,$t1

$s3$t1进行比较,并将$t7设置为0或1,具体取决于$s3是否小于$t1$t1仍然是垃圾(你从来没有把任何东西放进去),但事实证明,$s3为0并不重要,所以比较总是假的。这并不重要,因为在此之后你永远不会使用 $t7

    add $s1 ,$s3,$t1

$s3(即0)添加到$t1(这是垃圾),并将结果(垃圾)存储在$s1

    ble $s4, 7, bloop
bloop:

$s47进行比较,如果它小于7则进行分支。由于$s4为0,它将分支,但由于bloop紧跟在此之后,分支没有效果。所以这个(和标签)可能会被删除,因为他们什么都不做。

    srl $t7, $s0, 1

$s0移位1位并将其存储到$t7$s0在上面设置为0,并且移位0给出0,因此在$t7中存储0。

    sltu $t6, $s3, $t7

$s3(0)与$t7(0)进行比较,并将小于结果存储在$t6(0)

    add $s1, $t6, $s1

$t6添加到$s1,将结果放入$s1 - 这是自前三条li指令以来的第一条指令,它具有任何意义。但由于$t6是zer0,它实际上并没有做任何事情

    bgt $s4, 7, continue
continue:

另一个没有作为目标的分支就在分支之后。

总而言之,您的代码看起来像是一堆随机选择的指令,它们不做任何明智的事情。尽管有关于循环的评论,但没有循环。没有任何关于&#34; bits&#34;尽管如此,尽管问题已得到解答。