Регистры процессора

Последнее обновление: 10.07.2023

Чтобы производить операции с данными, их сначала надо загрузить в регистр процессора. Регистры - представляют ключевой компонент процессора. Вкратце рассмотрим, какие регистры мы можем использовать в архитектуре ARM64.

Регистры общего назначения

Архитектура Arm64 предоставляет 31 регистр общего назначения, которые применяются для любых задач, имеют размер 64 бита и называются X0, X1. . .X30. Также доступны 32-битные регистры W0–W30, которые представляют младшие 32 бита соответствующих регистров X0-X30. Например, регистры X1 и W1 схематически:

Регистры в архитектуре ARM64

Хотя регистры общего назначения могут использоваться для любых задач, для определенных ситуаций есть определенные рекомендации. В частности, для применения регистров при вызове функций существуют рекомендации Стандарта вызова процедур архитектуры 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

Регистр PC ( Program Counter - счетчик программ) - 64-битный регистр, который содержит адрес текущей инструкции. Перед выполнением каждая инструкция загружается из области памяти, на которую ссылается регистр PC. После выполнения инструкции PC автоматически переходит к следующей инструкции. В Armv8 нельзя явным образом обращаться к PC в инструкциях. Значение регистра PC может быть явно обновлено только с помощью генерации исключений и переходов.

Регистр SP

Регистр SP (Stack Pointer) или указатель стека хранит адрес верхушки стека. Область стека используется программами для хранения и доступа к данным локальных переменных для данной функции, а также в качестве временной памяти для хранения таких данных, как адреса возврата функции. Используя SP, можно загружать данные в стек или, наоборот, извлекать данные.

Регистр SP является 64-битным. К его младшим 32 битам можно обращаться как к отдельному регистру, который называется WSP.

Нулевой регистр

Нулевой регистр или XZR всегда содержит нулевое значение. Фактически он представляет тот же регистр, что и SP (то есть XZR и SP перекрывают друг друга). Любое чтение из регистра XZR возвращает значение 0, а записи в нулевой регистр игнорируются. Также доступна 32-битная форма регистра - WZR.

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

Регистр LR

Регистр LR (Link Register) перекрывает регистр X30 (то есть по сути LR и X30 представляют один и тот же регистра). Этот регистр можно свободно использовать для обычных вычислений; однако его основная цель — хранить адреса возврата при вызове функции.

Фрейм стека

Регистр общего назначения X29 также используется как указатель фрейма в стеке (Frame Pointer). Например, если стеке храняться переменные для определенной функции, то указатель фрейма стека применяется хранит базовый адрес фрейм стека, выделенного для функции, и применяется для доступа к ее локальным переменным в стеке.

Регистр состояния

Регистр состояния PSTATE хранит флаги состояния, которые могут устанавливаться в зависимости от выполняемых инструкций и их результатов.

Регистр состояния PSTATE в ARM64

Пользовательские программы обычно используют только старшие 4 бита - флаги N, Z, C и V. Вкратце посмотрим, какие флаги составляют этот регистр:

  • N: флаг знака, устанавливается, если результат операции представляет отрицательное число

  • Z: флаг нуля, устанавливается, если результат операции равен нулю

  • C: флаг переноса, устанавливается, если при выполнении арифметической операции произошел перенос

  • V: флаг переполнения, устанавливается, если при выполнении арифметической операции произошло переполнение со знаком

  • SS: бит 21- бит одношагового состояния (single-step state bit), используется отладчиками для пошаговой отладки программы

  • IL: бит 20 - флаг недопустимого состояния исключения

  • DAIF: биты 9-6 - флаги отключения прерываний

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850