Могу ли я настроить процессор ARM для направления роста Ascending Stack? - PullRequest
5 голосов
/ 25 мая 2009

Здесь был один вопрос, который говорил о направлении роста стека. На что Майкл Барр ответил, что в ARM можно настроить направление роста стека - т. Е. Либо нисходящий (нормальное поведение) стек возрастает к нулевому адресу (младший адрес) в памяти, либо возрастает, т. Е. Стек увеличивается к старшему адресу в памяти.

Каково направление роста стека в большинстве современных систем?

Мой вопрос таков: в процессорах ARM как сделать так, чтобы стек рос в восходящем направлении?

Как настроить стек как восходящий, так как по умолчанию он убывающий? Установить / сбросить любой регистровый бит и т. Д.

Ответы [ 3 ]

6 голосов
/ 25 мая 2009

Что ж, процессоры ARM не поддерживают стек напрямую, но у них есть инструкции, разработанные с учетом этого: LDM и STM. Так что, если вы используете STMDB в начале функции и LDMIA в конце, у вас фактически есть стек с полным + нисходящим стеком: ассемблеры, которые я помню, позволили вам написать «STMFD» и «LDMFD» в качестве псевдонимов. («Полный» стек - это тот, где указатель стека указывает на последнее слово в стеке, а не на следующее используемое место)

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

1 голос
/ 13 октября 2009

У вас есть функция __ user_initial_stackheap () , которая помогает вам менять SP с помощью Stack-Start, Stack-End и перемещения кучи с помощью Heap-Start, Heap-End. Эту функцию можно использовать во время инициализации, поскольку ARM будет использовать ее для перенаправления стека и кучи.

Кроме того, у вас есть возможность использовать модель с одним регионом или двумя запоминающими устройствами [в зависимости от ваших требований]. Я использовал этот API, когда писал сценарии использования, которые использовали ARM926EJ-S.

Этот документ был полезен при моей разработке и также может быть полезен вам.

Надеюсь, это поможет.

-hjsblogger

0 голосов
/ 26 мая 2009

Хммм thumb / thumb2 может ограничить вас в push / pop, и с только thumb2 только ARM, я не знаю, что мы можем сказать, что вы можете пойти обоими путями. Традиционные инструкции для рук, да, вы можете использовать ldmia или ldmdb (увеличение или уменьшение до) и stmdb и stmia. Как вы делаете компилятор C, например, подниматься вверх по адресам, а не вниз автоматически? Не знаю

На ARM это похоже на большой порядок, просто потому, что вы можете этого не хотеть из-за головной боли, которую он приносит с собой.

...