Регистрирует использование во время компиляции

Я нашел информацию о том, что регистры общего назначения r1-r23 и r26-r28 используются компилятором для хранения локальных переменных, но имеют ли они какое-либо другое назначение? Также к какой памяти относится эта часть регистров (кеш / ОЗУ)? Наконец, на что указывает глобальный указатель gp в регистре r26?

1 ответ

Решение

Также к какой памяти относится эта часть регистров (кеш / ОЗУ)?

Регистр является встроенным хранилищем, обеспечивающим быструю передачу данных (2 чтения /1 запись за цикл). Они хранят переменные, которые могут представлять адреса памяти, но, кроме того, они совершенно не связаны с памятью или кешем.

Я нашел информацию о том, что регистры общего назначения r1-r23 и r26-r28 используются компилятором для хранения локальных переменных, но имеют ли они какое-либо другое назначение?

Регистры используются в отношении аппаратных или программных соглашений. Соглашения об оборудовании связаны с архитектурой набора команд. Например, call инструкция передает управление подпрограмме и сохраняет адрес возврата в регистре r31 (ra), Очень неприятные вещи могут произойти, если вы перезаписать r31 зарегистрироваться любым способом без мер предосторожности. Соглашения о программном обеспечении должны обеспечивать правильное поведение, если они используются последовательно в программном обеспечении. Они указывают, какой регистр имеет специальное использование, которое необходимо сохранить при переключении контекста и т. Д. Эти условные обозначения могут быть изменены без изменений аппаратного обеспечения, но для этого, вероятно, потребуются изменения в нескольких программных средствах (компилятор, компоновщик, загрузчик, ОС и т. Д.)..).

регистры общего назначения r1-r23 и r26-r28 используются компилятором для хранения локальных переменных

На самом деле, некоторые регистры зарезервированы.

r1 используется asm для расширения макроса. (SW)

r2-r7 используются компилятором для передачи аргументов в функции или получения возвращаемых значений. (SW)

r24-r25 может использоваться только обработчиками исключений. (SW)

r26-r28 содержат различные указатели (глобальные, стек, фрейм), которые устанавливаются либо средой выполнения, либо компилятором и не могут быть изменены программистом. (sw)

r29-r31 являются hw-кодированными адресами возврата для подпрограмм или прерываний / исключений. (Hw)

Так только r8-r23 может использоваться компилятором.

но есть ли у них другая цель?

Нет, и поэтому они могут свободно использоваться компилятором или программистом.

Наконец, на что указывает глобальный указатель в регистре r26?

Доступ к памяти с загрузкой или хранением имеет основанную адресацию памяти. Эффективный адрес для ldx или же stx (где 'x' - это b, bu, h и т. д. в зависимости от характеристик данных) вычисляется путем добавления регистра и немедленного значения 16 бит. Это только позволяет перейти по адресу в пределах +/-32k от содержимого регистра.

Если процессор имеет адрес переменной в регистре (например, значение, возвращаемое malloc) немедленное позволяет сделать смещение для доступа к полям в структуре, следующем значении массива и т. д.

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

Адреса глобальных или статических переменных вычисляются путем добавления целого числа к глобальному указателю (r26 или же gp). Содержание gp соответствует началу сегмента данных в памяти и инициализируется загрузчиком непосредственно перед выполнением программы и не подлежит изменению. Непосредственное смещение относительно начала сегмента данных вычисляется компоновщиком, когда он определяет макет памяти.

Обратите внимание, что это позволяет получить доступ только к 64 Кб памяти из-за ширины 16 бит. Если размер глобальных / статических переменных превышает это значение, а переменная находится за пределами этого диапазона, перед вводом данных необходимо ввести пару инструкций, чтобы ввести 32 бита адреса переменной. С gp это не обязательно, и это способ обеспечить более быстрый доступ к глобальным переменным.

Другие вопросы по тегам