0

嗨,我试图将一点存储到临时文件中。登记。我这样做正确吗?当我在做的时候,我想看看有多少个 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:
4

1 回答 1

1

让我们看看你的代码:

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

这些指令将 3 个寄存器$s0、、$s3$s4设置为 0

    bgt $s0, 16, bottom

分支到bottomif$s0大于 16。现在最初为 0,并且在此之前$s0您没有标签,因此无法返回此处,因此永远不会采用此分支。此外,它甚至不会组装,因为您永远不会在任何地方定义标签。bottom

top:

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

    sb $t1, ($s0)

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

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

    sltu $t7,$s3,$t1

根据是否小于 ,$s3它比较$t1并设置为 0 或 1 。 仍然是垃圾(你从来没有把任何东西放进去),但事实证明这并不重要,因为它是 0,所以比较总是错误的。无论如何,这并不重要,因为在此之后您永远不会使用任何东西。$t7$s3$t1$t1$s3 $t7

    add $s1 ,$s3,$t1

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

    ble $s4, 7, bloop
bloop:

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

    srl $t7, $s0, 1

左移$s01 位并将其存储到$t7. $s0上面设置为 0,移位 0 得到 0,所以这将 0 存储在$t7.

    sltu $t6, $s3, $t7

比较$s3(0) 和$t7(0) 并将小于结果存储在$t6(0)

    add $s1, $t6, $s1

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

    bgt $s4, 7, continue
continue:

另一个不作为目标执行任何操作的分支就在该分支之后。

所以总的来说,你的代码看起来像一堆随机选择的指令,没有做任何明智的事情。尽管有关于循环的评论,但没有循环。尽管有问题的标题,但根本没有与“位”相关的内容。

于 2014-09-15T01:12:32.070 回答