Binary MIPS中存储位的混乱,

Binary MIPS中存储位的混乱,,binary,mips,machine-language,Binary,Mips,Machine Language,嗨,我想把一点钱存到临时工的口袋里。登记我这样做对吗?当我这样做的时候,我想看看有多少个1是十进制数(0-16)的二进制形式,我这样做对吗?这里是重要的代码块,其余的工作正常(只输出什么的) #对于(i=0;i让我们看看您的代码: li $s0, 0 li $s3, 0 li $s4, 0 这些指令将3个寄存器$s0、$s3和$s4设置为0 bgt $s0, 16, bottom 如果$s0大于16,则分支到底部。现在$s0最初将为0,并且在此之前您没有标签,

嗨,我想把一点钱存到临时工的口袋里。登记我这样做对吗?当我这样做的时候,我想看看有多少个1是十进制数(0-16)的二进制形式,我这样做对吗?这里是重要的代码块,其余的工作正常(只输出什么的)


#对于(i=0;i让我们看看您的代码:

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

    bgt $s0, 16, bottom
如果
$s0
大于16,则分支到
底部
。现在
$s0
最初将为0,并且在此之前您没有标签,因此无法返回此处,因此该分支将永远不会被执行。此外,它甚至不会组装,因为您从未在任何地方定义
底部
标签

top:
标签
top
,因此您可以作为循环分支回到这里——但您的代码没有到
top
的分支,因此它实际上永远不会分支

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

所以这个存储真的毫无意义。它将垃圾存储到一个无效的地址

    sltu $t7,$s3,$t1
这会将
$s3
$t1
进行比较,并根据
$s3
是否小于
$t1
$t7
设置为0或1,这取决于
$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,因此将0存储在
$t7

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

$t6
添加到
$s1
,将结果放入
$s1
——这是自前三条
li
指令以来第一条有意义的指令。但由于
$t6
是zer0,它实际上什么都不做

    bgt $s4, 7, continue
continue:
另一个不作为目标执行任何操作的分支位于该分支之后


因此,总体而言,您的代码看起来像是一堆随机选择的指令,没有任何合理的操作。没有循环,尽管有关于循环的注释。没有任何与“位”相关的内容,尽管问题的标题。

抱歉,忘了提及sb$t1,($s0),这给了我一个错误---0x00400034的运行时异常:地址超出范围0x00000000ya我现在看到我设置了一些值。循环底部和顶部工作,它们存在于我从较大程序中取出的这段代码之外。继续(据我所知)这就是我这段代码的最终目标:在数字0-16的二进制表示中找到1的数字,并将它们存储在寄存器$s1中。
    add $s1, $t6, $s1
    bgt $s4, 7, continue
continue: