Кроме того, к какой памяти относится этот регистр (кэш / ОЗУ)?
Регистр - это встроенное хранилище, обеспечивающее быструю передачу данных (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
это не требуется, и это способ обеспечить более быстрый доступ к глобальным переменным.