Регистрирует использование во время компиляции - PullRequest
0 голосов
/ 26 января 2019

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

1 Ответ

0 голосов
/ 26 января 2019

Кроме того, к какой памяти относится этот регистр (кэш / ОЗУ)?

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

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

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

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

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

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

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

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 это не требуется, и это способ обеспечить более быстрый доступ к глобальным переменным.

...