0

こんにちは、一時的に少し保存しようとしています。登録。私はこれを正しくやっていますか?そして、私はそれに取り組んでいますが、10進数(0〜16)の2進数形式で1がいくつあるかを確認しようとしていますが、これは正しいですか?ここに重要なコードのチャンクがあり、残りは正常に動作します(出力だけでなく、そうでないものもあります)

# 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

$s0これらの命令は、 、$s3、およびの 3 つのレジスタ$s4を 0に設定します。

    bgt $s0, 16, bottom

16 より大きいbottom場合に分岐します。最初は 0 になり、これより前にラベルがないため、ここに戻る方法がないため、この分岐は実行されません。また、ラベルをどこにも定義しないため、アセンブルさえしません。$s0$s0bottom

top:

ラベルtopなので、ループとしてここに分岐できますが、コードには への分岐がないtopため、実際には分岐しません。

    sb $t1, ($s0)

$t1で指定されたアドレスにからバイトを格納します$s0。初めてループに入ったとき、$t0何にも設定されていないので、何を保存していますか? さらに悪いことに、$s00 に設定されているため、アドレス 0 に保存しているため、クラッシュします (実行時エラーが発生します)。

だから、この店は本当に意味がありません。無効なアドレスにガベージを格納しています。

    sltu $t7,$s3,$t1

これは と比較$s3され、より小さいかどうかに応じて 0 または 1 に$t1設定されます。 はまだガベージです (何も入れていません) が、0 であるため問題ではないことが判明したため、比較は常に false になります。この後は何にも使用しないので、とにかく重要ではありません。$t7$s3$t1$t1$s3 $t7

    add $s1 ,$s3,$t1

$s3(ガベージ) に ( 0) を加算$t1し、結果 (ガベージ) を格納します。$s1

    ble $s4, 7, bloop
bloop:

比較$s4して77未満なら分岐。$s4は0なので分岐するが、bloopは直後なので分岐の効果はない。したがって、これ (およびラベル) は削除された可能性があります。

    srl $t7, $s0, 1

$s01 ビット位置を左にシフトし、 に格納し$t7ます。 $s0は上記で 0 に設定されており、0 をシフトすると 0 になるため、これは に 0 を格納し$t7ます。

    sltu $t6, $s3, $t7

$s3(0) と (0) を比較$t7し、より小さい結果を$t6(0)に格納します。

    add $s1, $t6, $s1

に加算$t6$s1、結果を入れます。$s1これは、最初の 3 つの命令以降、li何らかの意味を持つ最初の命令です。しかし、$t6zer0 の場合と同様に、実際には何もしません。

    bgt $s4, 7, continue
continue:

ターゲットとして何もしない別のブランチは、ブランチの直後にあります。

全体として、コードは無作為に選択された命令の集まりのように見えますが、意味のあることは何もしていません。ループに関するコメントがありますが、ループはありません。質問のタイトルにもかかわらず、「ビット」に関連するものはまったくありません。

于 2014-09-15T01:12:32.070 に答える