嗨我试图将一点存入临时。寄存器。我这样做是否正确?虽然我在它,我试图看到有多少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:
答案 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:
将$s4
与7
进行比较,如果它小于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;尽管如此,尽管问题已得到解答。