Binary MIPS中存储位的混乱,
嗨,我想把一点钱存到临时工的口袋里。登记我这样做对吗?当我这样做的时候,我想看看有多少个1是十进制数(0-16)的二进制形式,我这样做对吗?这里是重要的代码块,其余的工作正常(只输出什么的)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,并且在此之前您没有标签,
#对于(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: