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