2013-10-28 2 views
0

Я новичок в ARM сборки и читать о инструкции BL, который говоритКак защитить r14 регистр в ARM

инструкции BL и BLX скопировать адрес следующей команды в ЛО (r14).

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

Как защитить r14 от не перезаписываемой какой-либо другой рутиной?

+0

Возможный дубликат [ARM: реестр ссылок и указатель кадра] (http://stackoverflow.com/questions/15752188/arm-link-register-and-frame-pointer) –

ответ

1

Если ваша функция будет вызывать другую функцию (или использовать r14 в качестве gpr), то нажмите ее в стек при входе в функцию (или, по крайней мере, до ее изменения), а затем восстановите ее в какой-то момент перед вами вернуть.

stmdb r13!,{lr} 
... 
bl somefunction 
... 
ldmia r13!,{pc} 

Если вы смешиваете C и сборку или любой скомпилированный код, то вы должны попытаться соответствовать рукам EABI, который теперь хочет стек 64 бит выровнен таким образом подтолкнуть другой регистр, не имеет значение, если вам нужно или не так, чтобы у вас было четное количество регистров, которые были нажаты и вытолкнуты.

+0

Да @dwelch, это что-то вроде того, что мы делали в x86, соглашение об условном освобождении. –

+0

это целевое независимое решение/соглашение. Используйте стек для сохранения локальной (функции, области) информации. –

2

Если вы программируете в сборке, что это за «другая программа или рутина», о которой вы так боитесь?

Вы коллируете чужой код? Если вы, то должны применяться стандартные соглашения о вызовах ARM, и тот факт, что регистр LR используется для связи, хорошо известен. В своем собственном коде просто убедитесь, что вы не пытаетесь использовать регистр ни для чего другого или сначала сохраните его, если хотите.

+0

Спасибо @unwind. Я просто думал в virtula multicore, где в то же время появляется несколько ядер. Есть вероятность, что r14 будет перезаписана. –

+0

Конечно, у других ядер есть свое собственное состояние выполнения (иначе, как вы могли бы надежно запрограммировать что-либо вообще?) Если вы пишете многопоточную программу, вам обычно приходится беспокоиться о состоянии глобальной видимой памяти, но не регистры или память, используется только локально. – gsg

Смежные вопросы