Каковы сценарии использования временных регистров в ARM? - PullRequest
0 голосов
/ 10 июля 2020

Почему у нас в архитектуре ARM есть рабочий регистр? Как процессор его использует, я имею в виду, для чего предназначен этот регистр?

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Из стандарта вызова процедур для архитектуры Arm :

Рабочий регистр / временный регистр Регистр, используемый для хранения промежуточного значения во время вычислений (обычно такие значения не называются в исходном коде программы и имеют ограниченное время жизни).

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

0 голосов
/ 11 июля 2020

Почему у нас в архитектуре 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 никогда не является регистром нуля .

Ссылки

...