Учитывая традиционный цикл while в C:
while(save[i] == k)
i += 1;
Ответ в MIPS таков:
Первый шаг - загрузить save [i] во временный регистр.Прежде чем мы сможем загрузить save [i] во временный регистр, нам нужен его адрес.Прежде чем мы сможем добавить i в базу массива save, чтобы сформировать адрес, мы должны умножить индекс i на 4 из-за проблемы адресации байтов.К счастью, мы можем использовать логический сдвиг влево, поскольку сдвиг влево на 2 бита умножается на 22 или 4 (см. Стр. 88 в предыдущем разделе).Нам нужно добавить к нему метку Loop, чтобы мы могли вернуться к этой инструкции в конце цикла:
Loop: sll $t1,$s3,2 # Temp reg $t1 = i * 4
Чтобы получить адрес save [i], нам нужно добавить $ t1и база сохранения в $ s6:
add $t1,$t1,$s6 # $t1 = address of save[i]
Теперь мы можем использовать этот адрес для загрузки сохранения [i] во временный регистр:
lw $t0,0($t1) # Temp reg $t0 = save[i]
Следующая инструкция выполняет циклтест, выход, если сохранить [i] ≠ k:
bne $t0,$s5, Exit # go to Exit if save[i] ≠ k
Тогда
addi $s3, $s3, 1 #i = i+1
j Loop # go to Loop
Exit:
Тем не менее, с этим объяснением, я все еще не могу получить его.
Я не понимаю, почему мы должны сдвигаться влево на 2 бита.Я не понимаю цели логического перехода влево / вправо, и я не могу связать объяснения онлайн с практическими задачами и примерами.
Поскольку я даже не получаю шаг 1, я не получаю шаг 2, который складывает результат сдвига ($ t1) и базу сохранения в $ s6,
По сути, мне нужно объяснение этой проблемы, потому что даже с ответами я не совсем понимаю.Мне действительно нужно простое (тупое) объяснение, которое четко объяснило бы каждый шаг и почему это делается.ПОЖАЛУЙСТА и спасибо!