Почему использование регистра указателя кадра устарело в стандарте вызова процедур ARM?

Я читаю стандарт вызова процедур ARM:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0041c/Cegbidie.html

В нем говорится:

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

Может кто-нибудь сказать мне, почему? Я думал, что нужен указатель кадра, если размер кадра стека неизвестен во время компиляции.


person metalogic    schedule 15.09.2012    source источник
comment
почему размер кадра стека неизвестен во время компиляции? Еще одна причина для указателей фреймов - простота программирования (и отладки компилятора), а также иногда просто способ работы набора инструкций. Для руки особо не нужен.   -  person old_timer    schedule 15.09.2012
comment
@dwelch Массивы динамического размера в стеке могут быть одним из очень очевидных примеров.   -  person marko    schedule 15.09.2012
comment
Можете ли вы привести несколько примеров этого?   -  person old_timer    schedule 15.09.2012
comment
Примеры, int *p = alloca(var1); int var_arr[var2];   -  person artless noise    schedule 19.04.2013


Ответы (1)


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

Это, конечно, удобно, но не обязательно.

person MSN    schedule 15.09.2012
comment
Конечно, это не столько в интересах компилятора, потому что, как вы говорите, он может отслеживать использование стека и отменять его в конце функции, а скорее для отладчиков, которые не обязательно знают, что отношение было текущим sp и основание текущего кадра. - person marko; 15.09.2012
comment
@Marko, компилятор может выдавать отладочную информацию для этого отладчика. - person MSN; 15.09.2012