Нахождение смещения из фрагмента кода - PullRequest
2 голосов
/ 08 ноября 2011

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

Рассмотрим следующий код 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 (смещение слова).Прав ли я с таким подходом?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

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

2 голосов
/ 08 ноября 2011

AFAIK, боюсь, что нет.

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

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

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

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

...