Поиск смещения из фрагмента кода

Я немного застрял со следующим вопросом,

Рассмотрите следующий код MIPS и ответьте на следующие вопросы.

addi $t1, $s0, 400
loop: lw $s1, 0($s0)
add $s2, $s2, $s1
lw $s1, 4($s0)
add $s2, $s2, $s1
addi $s0, $s0, 8
bne $t1, $s0, loop

В какое значение переводится цикл меток в инструкции условного перехода?

Теперь я знаю математическую формулу для целевого адреса филиала. Но здесь, поскольку адресация памяти не производится, я нашел смещение, подсчитав строки между целевым адресом и ПК. Это дает ответ 7 (смещение слова). Прав ли я с таким подходом?


person Community    schedule 08.11.2011    source источник
comment
Действительно? Ответ Владимира выбран? Невероятный...   -  person m0skit0    schedule 08.11.2011
comment
@ m0skit0: Да, вы оба были правы в ответах. Он также упомянул PC+4.   -  person    schedule 09.11.2011
comment
Я ответил перед ним и более подробно. В любом случае нп.   -  person m0skit0    schedule 10.11.2011


Ответы (2)


Небольшой эксперимент с симулятором MARS http://courses.missouristate.edu/KenVollmar/MARS/download.htm дал мне ответ -6, -5 из-за разницы в количестве строк и еще -1, потому что ПК увеличивается на 1 после инструкции.

person Vladimir F    schedule 08.11.2011

АФАИК, боюсь, что нет.

Как сказано в справочнике по инструкции MIPS:

18-битное смещение со знаком (16-битное поле смещения, сдвинутое влево на 2 бита) добавляется к адресу инструкции, следующей за ветвью (не самой ветвью), в слоте задержки ветвления, чтобы сформировать эффективную цель относительно ПК адрес.

Насколько я понимаю, расстояние от инструкции перехода до метки loop отрицательно (потому что метка находится перед ветвью, поэтому адрес ниже). Расстояние рассчитывается в количестве слов (отсюда сдвиг влево на 2 бита). Поскольку все инструкции MIPS имеют размер 4 байта, раньше было бы 6 инструкций, следовательно, -6 — это значение, которое должно появиться в смещении инструкции ветвления (нижнее полуслово). В двоичном формате: 1111 1111 1111 1010 (дополнение до двух). В шестнадцатеричном формате: FFFA.

Проверил на симуляторе и кажется, что мои рассуждения верны, так как инструкция закодирована как 0x1530FFFA.

person m0skit0    schedule 08.11.2011
comment
Вы были быстрее, просто исправление, 4 байта, а не биты - это ширина закодированной инструкции. - person Vladimir F; 08.11.2011