Передача адреса возврата в регистр, а не в стек, в большинстве случаев не помогает.
Большинство ISA RISC уже делают это с помощью регистра ссылок, и их call
эквивалент - это переход и соединение (MIPS jal
) или ARM bl
). Вызываемый должен сохранить адрес возврата в стеке самостоятельно, если он хочет вызвать дочернюю функцию, потому что jal
забивает регистр связи. (Таким образом, они в конечном итоге возвращаются, загружая адрес возврата в регистр и используя инструкцию перехода к регистру.)
Это принципиально не отличается от того, что делает x86, где ret
в основном pop rip
напрямую. Единственным отличием будут конечные функции, где адрес возврата никогда не будет помещен в память, если вызываемый объект не разлит / перезагружает его, чтобы получить дополнительный пустой регистр.