Путаница в хранении битов MIPS,
Привет я пытаюсь сохранить немного в темп. регистр. Я делаю это правильно? и в то время как я нахожусь в этом, я пытаюсь видеть, сколько 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:
1 ответ
Давайте посмотрим на ваш код:
li $s0, 0
li $s3, 0
li $s4, 0
эти инструкции устанавливают 3 регистра $s0
, $s3
, а также $s4
до 0
bgt $s0, 16, bottom
Филиал в bottom
если $s0
больше 16. Теперь $s0
изначально будет 0, и у вас не было ярлыков до этого, поэтому нет никакого способа вернуться сюда, поэтому эта ветвь никогда не будет принята. Кроме того, он даже не будет собираться, так как вы никогда не определяете 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, так что это сохраняет 0 в $t7
,
sltu $t6, $s3, $t7
сравнить $s3
(0) до $t7
(0) и сохранить результат меньше чем в $t6
(0)
add $s1, $t6, $s1
добавлять $t6
в $s1
положить результат в $s1
- это первая инструкция с первых трех li
инструкции, которые имеют какой-либо смысл. Но, как $t6
был ноль, это на самом деле ничего не делает
bgt $s4, 7, continue
continue:
Другая ветвь, которая ничего не делает в качестве цели, находится сразу за веткой.
Итак, в целом, ваш код выглядит как набор случайно выбранных инструкций, которые не делают ничего разумного. Там нет цикла, несмотря на комментарии о цикле. Там нет ничего общего с "битами", несмотря на название вопроса.