MIPS - путаница JAL: $ ra = ПК + 4 или ПК + 8? - PullRequest
13 голосов
/ 03 марта 2012

У меня проблемы с пониманием того, как инструкция jal работает в процессоре MIPS. Мои два вопроса:
а) Какое значение хранится в R31 после "jal": ПК + 4 или ПК + 8 ?
b) Если это действительно ПК + 8 , что происходит с инструкцией в ПК + 4 ? Это выполнено перед прыжком или никогда не выполняется?

В Паттерсон и Хеннесси (четвертое издание), стр. 113:

"инструкция перехода и ссылки: инструкция, которая переходит на адрес и адрес и одновременно сохраняет адрес следующей инструкции в регистре ( $ ra в MIPS)"

"программный счетчик ( ПК ): регистр, содержащий адрес инструкции в выполняемой программе"

После прочтения этих двух операторов следует, что значение, сохраненное в $ ra , должно быть ( PC + 4 ).

Однако в справочных данных MIPS (зеленая карта), которые прилагаются к книге, алгоритм инструкции jal определяется следующим образом:
"Прыжок и соединение: jal: J: R [31] = ПК + 8; ПК = JumpAddr"

Этот веб-сайт также заявляет, что "это действительно ПК + 8 ", но странным образом после этого он говорит, что, поскольку конвейерная обработка является сложной темой ", мы примем адрес возврата ПК + 4".
Я пришел из сборки 8086, так что я знаю, что есть большая разница между возвратом к адресу и тому, который следует за ним, потому что программы не будут работать, если я просто приму что-то, что не соответствует действительности. Спасибо.

Ответы [ 2 ]

14 голосов
/ 03 марта 2012

Адрес в $ ra на самом деле PC + 8. Инструкция, следующая непосредственно за инструкцией jal, находится в « слоте задержки перехода ». Он выполняется до того, как функция введена, поэтому его не следует повторять при возвращении функции.

Другие инструкции ветвления на Mips также имеют слоты задержки ветвления.

Слот задержки используется, чтобы сделать что-то полезное за время, необходимое для выполнения инструкции jal.

1 голос
/ 19 января 2014

У меня такой же вопрос.Погуглил этот отличный ответ Ричарда, а также еще одну ссылку, которую я хотел бы добавить здесь.

Ссылка http://chortle.ccsu.edu/AssemblyTutorial/Chapter-26/ass26_4.html с этим замечательным объяснением двойного добавления 4 на ПК.Таким образом, фактическое выполнение имеет два дополнения: 1) newPC = PC + 4 с помощью конвейерной передачи и 2) другое добавление $ ra = newPC + 4 с помощью инструкции jal, в результате чего эффективный $ ra = (адрес инструкции jal) + 8.

...