В x86 инструкция вызова помещает адрес возврата в память в стек.В MIPS инструкция вызова (jal
) помещает адрес возврата в регистр.
В x86 инструкция ret удаляет адрес возврата из стека и переходит на него.Философия MIPS не объединяет отдельные шаги в одну инструкцию.Это значительно упрощает набор инструкций.Удаление значения из стека и выполнение ветви - это отдельные операции, требующие отдельных инструкций.В частном случае вызова / возврата также имеет то преимущество, что в конечной функции нет необходимости записывать адрес возврата в память вообще.
X86 имеет эквивалент инструкции jr, jmp r/m32
с указанием пункта назначения в качестве регистра.Эта инструкция обычно не используется для возврата функции, потому что тогда для извлечения адреса возврата из стека в регистр потребуется отдельная инструкция (но я написал код, который делает именно это при особых обстоятельствах).