Чтобы производить операции с данными, их сначала надо загрузить в регистр процессора. Регистры - представляют ключевой компонент процессора. Вкратце рассмотрим, какие регистры мы можем использовать в архитектуре ARM64.
Регистры общего назначения
Архитектура Arm64 предоставляет 31 регистр общего назначения, которые применяются для любых задач, имеют размер 64 бита и называются X0, X1. . .X30. Также доступны 32-битные регистры W0–W30, которые представляют младшие 32 бита соответствующих регистров X0-X30. Например, регистры X1 и W1 схематически:Хотя регистры общего назначения могут использоваться для любых задач, для определенных ситуаций есть определенные рекомендации. В частности, для применения регистров при вызове функций существуют рекомендации Стандарта вызова процедур архитектуры Arm (Arm Architecture Procedure Call Standard или AAPCS64), который предписывает следующее:
Регистры X0–X7 используются для передачи параметров в функцию и возвращения результата.
Регистр X8 используется для передачи в функцию адреса блока памяти при непрямой адресации.
Регистры X9–X15 следует сохранять при вызове функций. Ответственность за сохранение ложится на вызывающую сторону, которая вызывает функцию. Затронутые регистры сохраняются в кадре стека вызывающей функции, что позволяет подпрограмме изменять эти регистры..
Регистры X16–X18 используются для хранения промежуточных результатов между вызовами функций.
Регистры X19–X28 - это регистры, сохраняемые вызываемой функцией в стека, что позволяет функции изменять эти регистры, но также требует их восстановления перед возвратом к вызывающей стороне.
Регистр X29 используются как указатель на фрейм стека, еще называется FP (frame pointer).
Регистр X30 используются для хранения адреса возврата из функции, еще называется LR (link register).
В дополнение ARM64 еще ряд регистров, которые выполняют определенные функции.
Регистр PC ( Program Counter - счетчик программ) - 64-битный регистр, который содержит адрес текущей инструкции. Перед выполнением каждая инструкция загружается из области памяти, на которую ссылается регистр PC. После выполнения инструкции PC автоматически переходит к следующей инструкции. В Armv8 нельзя явным образом обращаться к PC в инструкциях. Значение регистра PC может быть явно обновлено только с помощью генерации исключений и переходов.
Регистр SP (Stack Pointer) или указатель стека хранит адрес верхушки стека. Область стека используется программами для хранения и доступа к данным локальных переменных для данной функции, а также в качестве временной памяти для хранения таких данных, как адреса возврата функции. Используя SP, можно загружать данные в стек или, наоборот, извлекать данные.
Регистр SP является 64-битным. К его младшим 32 битам можно обращаться как к отдельному регистру, который называется WSP.
Нулевой регистр или XZR всегда содержит нулевое значение. Фактически он представляет тот же регистр, что и SP (то есть XZR и SP перекрывают друг друга). Любое чтение из регистра XZR возвращает значение 0, а записи в нулевой регистр игнорируются. Также доступна 32-битная форма регистра - WZR.
Нулевой регистр может применяться для инструкций, которые используются для установки флагов условий, и для сохранения без изменений регистров, участвующих в этих инструкциях.
Регистр LR (Link Register) перекрывает регистр X30 (то есть по сути LR и X30 представляют один и тот же регистра). Этот регистр можно свободно использовать для обычных вычислений; однако его основная цель — хранить адреса возврата при вызове функции.
Регистр общего назначения X29 также используется как указатель фрейма в стеке (Frame Pointer). Например, если стеке храняться переменные для определенной функции, то указатель фрейма стека применяется хранит базовый адрес фрейм стека, выделенного для функции, и применяется для доступа к ее локальным переменным в стеке.
Регистр состояния PSTATE хранит флаги состояния, которые могут устанавливаться в зависимости от выполняемых инструкций и их результатов.
Пользовательские программы обычно используют только старшие 4 бита - флаги N, Z, C и V. Вкратце посмотрим, какие флаги составляют этот регистр:
N
: флаг знака, устанавливается, если результат операции представляет отрицательное число
Z
: флаг нуля, устанавливается, если результат операции равен нулю
C
: флаг переноса, устанавливается, если при выполнении арифметической операции произошел перенос
V
: флаг переполнения, устанавливается, если при выполнении арифметической операции произошло переполнение со знаком
SS
: бит 21- бит одношагового состояния (single-step state bit), используется отладчиками для пошаговой отладки программы
IL
: бит 20 - флаг недопустимого состояния исключения
DAIF
: биты 9-6 - флаги отключения прерываний