Просто добавляю два моих цента к уже хорошим ответам.
Это часть хорошей языковой архитектуры, имеющая цепочку кадров стека. BP указывает на текущий кадр, где хранятся локальные переменные подпрограммы. (Локальные значения имеют отрицательные смещения, а аргументы имеют положительные смещения.)
Идея, что это предотвращает использование совершенно хорошего регистра в оптимизации, поднимает вопрос: когда и где на самом деле стоит оптимизация?
Оптимизация имеет смысл только в узких циклах, которые 1) не вызывают функции, 2) где счетчик программы тратит значительную часть своего времени, и 3) в коде, который фактически когда-либо увидит компилятор (то есть небиблиотечные функции) , Обычно это очень небольшая часть всего кода, особенно в больших системах.
Другой код можно перевернуть и сжать, чтобы избавиться от циклов, и это просто не будет иметь значения, потому что счетчик программ практически никогда не существует.
Я знаю, что вы не спрашивали об этом, но по моему опыту, 99% проблем с производительностью не имеют ничего общего с оптимизацией компилятора. Они имеют все, что связано с чрезмерным дизайном.