Понимание MIPS во время цикла - PullRequest
0 голосов
/ 12 марта 2019

Учитывая традиционный цикл 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: 

Тем не менее, с этим объяснением, я все еще не могу получить его.

  1. Я не понимаю, почему мы должны сдвигаться влево на 2 бита.Я не понимаю цели логического перехода влево / вправо, и я не могу связать объяснения онлайн с практическими задачами и примерами.

  2. Поскольку я даже не получаю шаг 1, я не получаю шаг 2, который складывает результат сдвига ($ t1) и базу сохранения в $ s6,

По сути, мне нужно объяснение этой проблемы, потому что даже с ответами я не совсем понимаю.Мне действительно нужно простое (тупое) объяснение, которое четко объяснило бы каждый шаг и почему это делается.ПОЖАЛУЙСТА и спасибо!

1 Ответ

0 голосов
/ 13 марта 2019

Представьте, что у вас есть данные, начинающиеся со значения временного адреса:

temp address V
             | ValueA | ValueB | ValuesC  |
Byte  offset  0  1 2 3  4 5 6 7  8 9 10 11
Array index   0         1        2

Предполагается, что каждый «элемент» представляет собой целое число длиной 4 байта.

При полученииадрес начала элемента, вы можете видеть, что он кратен 4

MIPS не заботится о том, что находится по адресу (с точки зрения размеров), поэтому вам нужно справиться с этим самостоятельно.

Таким образом, адрес 1-го элемента находится по адресу tempaddress + 0, второй элемент по адресу tempaddress+(1*4) и т. Д.

Или, если сделать его более общим, элемент X имеет значение temp address + (X*4)

X * 4 - это то же самое, что смещение X влево на 2.

Т.е.: если X было значением 1 в двоичном виде, то есть 0000 0001

Сдвиг влево на 2, чторавно 0000 0100 или десятичному 4.

, если X было значением 3 в двоичном формате, то есть 0000 0011

Смещено влево на 2, то есть 0000 1100 или в десятичном 6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...