Почему у нас в архитектуре ARM есть рабочий регистр? Я имею в виду, какова цель этого регистра?
Он эффективен, потому что временные регистры не нужно сохранять перед использованием. Вам понадобится хотя бы один рабочий регистр, чтобы выполнять множество прологов и эпилогов функций.
Как его использует процессор
Это просто обычный регистр процессора.
В ARM нет «скретч-регистра». Вы можете называть его сохраненным регистром «вызывающего абонента»; но это EABI / AAPCS или что-то еще, чему вы можете соответствовать. Это не внутри «архитектуры». Это соглашение, используемое для взаимодействия кода. Это может включать вызовы ОС, вызовы библиотек и взаимодействие инструментов (межъязыковые вызовы). В зависимости от программной инфраструктуры / инструментов, которые вы используете, могут действовать разные, но очень похожие стандарты.
Для традиционной ARM есть четыре сохраненных регистра «вызывающего абонента». Они r0-r3. Они также являются параметрами функции и возвращаемым значением. Подпрограмма, предназначенная для взаимодействия, может использовать r0-r3 для любых целей, даже если они не являются частью списка параметров. Например, подпрограмме типа void foo(void)
даже не потребуется r0, но подпрограмма может использовать r0 без ее сохранения. Подпрограмма, которая вызывает foo()
, должна сохранять r0, если это важно сохранить. В этом случае r0-r3 - это кратковременные регистры или временные регистры . В отличие от регистров r4-r11 примечание , которые должны быть сохранены (в стеке), если они будут использоваться.
r12 или ip
, которые обычно не являются специальными для ассемблера и также могут считаться скретч-реестром. r12
- царапина, но по другим причинам , чем r0-r3. r12
не используется как регистр параметров, поэтому его можно использовать в коде пролога (начало процедуры).
Может быть дополнительное ограничение, если вы хотите, чтобы ваша процедура использовалась в «обратной трассировке». Вы можете пометить свою процедуру как «неотслеживаемую» для трассировки стека с помощью псевдооперации .cantunwind
. Это не ассемблер ARM, но он будет «метаданными» в файле ELF. В этом случае вы можете использовать r14 (lr) как сохраненный регистр; не царапина .
В проекте чистой сборки все регистры могут быть временными регистрами. Например, исходный код, который загружает процессор, обычно не нуждается в сохранении, и все регистры пустые. Исключением может быть указатель стека.
Примечание: Некоторые системы используют r9 специального назначения, но это бывает редко. Одним из примеров может быть u-boot. r9 никогда не является регистром нуля .
Ссылки