У меня проблемы с пониманием того, как инструкция jal работает в процессоре MIPS.Два моих вопроса:
a) Какое значение хранится в R31 после "jal": PC+4 или PC+8 ?
b) Если это действительно PC+8, что происходит с инструкцией по адресу PC+4? Выполняется ли она перед переходом или никогда не выполняется?
В Patterson and Hennessy (четвертое издание), стр. 113:
«Инструкция перехода и ссылки: инструкция, которая переходит к адресу и одновременно сохраняет адрес следующей инструкции в регистре ($ra в MIPS)"
"счетчик программ (PC): регистр, содержащий адрес инструкции в выполняемой программе"
После прочтения этих двух утверждений следует, что значение, сохраненное в $ra, должно быть (PC+4).
Однако в справочных данных MIPS (зеленая карточка), прилагаемых к книге, алгоритм инструкции jal определяется следующим образом:
«Перейти и связать : jal : J : R[31]=PC+8; PC=JumpAddr"
На этом веб-сайте также говорится, что "это действительно PC+8", но, как ни странно, после этого говорится, что, поскольку конвейерная обработка является сложной темой, "мы предположим, что обратный адрес — PC+4».
Я родом из сборки 8086, поэтому я знаю, что есть большая разница между возвратом на адрес и на следующий за ним, потому что программы не будут работать, если я просто предположу что-то, что не соответствует действительности. Спасибо.