RISC-архитектуры имеют тенденцию иметь меньше специальных инструкций или поведений - вместо этого для управления стеком используются стандартные инструкции.Обычно это означает, что программы больше, сам ЦП проще, а компилятор, как ожидается, будет оптимизировать сложнее
Рассмотрим:
int bar(int a)
{
return a * a;
}
void foo()
{
bar(22);
}
foo();
Здесь bar()
- это лист function - функция, которая не выполняет дальнейшие вызовы функций.Поэтому обратный адрес в LR
никогда не будет перезаписан.Как следствие, его вообще не нужно записывать в стек.Это сохраняет и загружает и сохраняет из / в память.
foo()
, с другой стороны, будет мутировать LR
, потому что он вызывает функцию, поэтому ему нужно будет сохранить адрес возврата вызывающей стороны в стеке.
Сравните это с архитектурой, в которой выполнение вызова функции автоматически помещает адрес возврата в стек - эта оптимизация невозможна.
Все версии стандарта вызова процедур ARM определяют регистр сохраняемых регистров для вызова функции - регистры, которые может ожидать вызывающая сторона при вызове функции.Если функция тривиальна, это снова приводит к отсутствию доступа к памяти.
В прерываниях время часто более критично.Процессоры ARM имеют набор теневых регистров, которые доступны только в состоянии прерывания.Это означает, что могут быть написаны тривиальные обработчики прерываний, которые не требуют доступа к памяти.