Почему ARM сохраняет адрес возврата в регистре ссылок, а не в стеке? - PullRequest
2 голосов
/ 20 мая 2019

Я искал этот ответ уже больше недели, но безуспешно.До сих пор я узнал, что стек сохраняет адрес возврата, когда происходит вложение или прерывание функции, но недавно я узнал, что современные процессоры используют регистр связи для достижения той же цели.После некоторых исследований я узнал, что стек действительно используется для сохранения адреса возврата в старых процессорах.Однако мне не имеет смысла, почему современные процессоры используют целый отдельный регистр (LR) для сохранения адреса возврата, когда работала более старая реализация?Каковы преимущества LR по сравнению с реализацией на основе стека?

Заранее спасибо !!!

1 Ответ

2 голосов
/ 20 мая 2019

RISC-архитектуры имеют тенденцию иметь меньше специальных инструкций или поведений - вместо этого для управления стеком используются стандартные инструкции.Обычно это означает, что программы больше, сам ЦП проще, а компилятор, как ожидается, будет оптимизировать сложнее

Рассмотрим:

int bar(int a)
{
    return a * a;
}

void foo()
{
    bar(22);
}


foo();

Здесь bar() - это лист function - функция, которая не выполняет дальнейшие вызовы функций.Поэтому обратный адрес в LR никогда не будет перезаписан.Как следствие, его вообще не нужно записывать в стек.Это сохраняет и загружает и сохраняет из / в память.

foo(), с другой стороны, будет мутировать LR, потому что он вызывает функцию, поэтому ему нужно будет сохранить адрес возврата вызывающей стороны в стеке.

Сравните это с архитектурой, в которой выполнение вызова функции автоматически помещает адрес возврата в стек - эта оптимизация невозможна.

Все версии стандарта вызова процедур ARM определяют регистр сохраняемых регистров для вызова функции - регистры, которые может ожидать вызывающая сторона при вызове функции.Если функция тривиальна, это снова приводит к отсутствию доступа к памяти.

В прерываниях время часто более критично.Процессоры ARM имеют набор теневых регистров, которые доступны только в состоянии прерывания.Это означает, что могут быть написаны тривиальные обработчики прерываний, которые не требуют доступа к памяти.

...