никогда. Когда-нибудь наши внуки будут удивляться, как же могли работать компьютеры, содержащие всего 32-разрядные адреса и 4 Гбайт памяти.
Архитектура команд SPARC достаточно проста, хотя организация регистров была немного усложнена, чтобы сделать вызовы процедур более эффективными. Практика показывает, что организация регистров требует больших усилий, и, хотя обычно эти усилия того не стоят, правило совместимости не позволяет от этого отказаться.
В системе UltraSPARC III имеется две группы регистров: 32 64-разрядных регистра общего назначения и 32 регистра для команд с плавающей точкой. Регистры общего назначения называются R0-R31, но в определенных контекстах используются другие названия. Варианты названий регистров и их функции приведены в табл. 5.1.
Таблица 5.1. Регистры общего назначения в системе UltraSPARC III
Регистр |
Другой вариант названия во |
Назначение Аппаратный нуль. То, что сохранено в этом регистре, просто игнорируется |
01-07 |
Содержат глобальные переменные |
|
И8-ШЗ |
00-05 |
Содержат параметры вызываемой процедуры |
т4 |
БР |
Указатель стека |
Я15 |
Временный регистр |
|
1.0-1-7 |
Содержат локальные переменные для текущей процедуры |
|
И24-И29 |
10-15 |
Содержат входные параметры |
ИЗО |
РР |
Указатель на базу текущего стекового фрейма |
ИЗ! |
Содержит адрес возврата для текущей процедуры |
Все регистры общего назначения 64-разрядные. Все они, кроме R0, который всегда нулевой, могут считываться и записываться при помощи различных команд загрузки и сохранения. Назначение этих регистров, приведенное в табл. 5.1, отчасти определено по соглашению, отчасти зависит от используемого аппаратного обеспечения. Однако, вообще говоря, не стоит отклоняться от указанного назначения, если вы не являетесь крупным специалистом по компьютерам SPARC. Программист должен быть уверен, что программа правильно обращается к регистрам и выполняет с ними допустимые арифметические действия. Например, очень легко загрузить числа с плавающей точкой в регистры общего назначения, а затем произвести над ними целочисленное сложение — операцию, результатом которой будет полнейшая чепуха, но которую центральный процессор обязательно выполнит, если того потребует программа.
Глобальные переменные используются для хранения констант, переменных и указателей, которые нужны во всех процедурах, хотя при необходимости они могут загружаться и перезагружаться при входе в процедуру и при выходе из процедуры. Регистры 1х и Ох используются для передачи параметров процедурам, чтобы избежать обращений к памяти. Далее мы расскажем, как это происходит.
Специальные регистры используются для особых целей. Регистры РР и БР ограничивают текущий фрейм. Первый указывает на базу текущего фрейма и применяется для обращения к локальным переменным, точно так же, как ЬУ на рис. 4.9. Второй указывает на текущую вершину стека и изменяется, когда слова помещаются в стек или выталкиваются оттуда. Значение регистра РР изменяется только при вызове и завершении процедуры. Третий специальный регистр — Я31. Он содержит адрес возврата для текущей процедуры.