
Программно доступные регистры
Программно доступные регистры, в свою очередь, можно разделить на четыре категории:
• регистры общего назначения (или универсальные регистры);
• регистры данных;
• регистры адреса;
• регистры кодов условий.
Регистры общего назначения программист может использовать по своему усмотрению для выполнения самых разных функций. Иногда система команд никак не связывает их функции с выполняемой операцией (это бывает в системах команд, в которых поля кода операций и операндов ортогональны). В таком случае мы действительно имеем дело с универсальными регистрами, т.е. любой регистр может использоваться для спецификации любого операнда в любой машинной команде. Но чаще всего возможность применения того или иного регистра все-таки в определенной мере ограничивается. Например, для работы с системным стеком и числами в формате с плавающей точкой используются не любые, а только определенные регистры.
В некоторых конструкциях процессоров регистры общего назначения можно применять для адресации операндов (т.е. косвенной адресации через регистр, адресации со смещением и т.п.). В других конструкциях существует жесткое разделение между регистрами адреса и регистрами данных. Регистры данных разрешается использовать только для хранения операндов и результатов, но они не принимают участия в вычислении исполнительного адреса. Регистры адреса могут быть в определенной степени универсальными, а могут и предназначаться только для определенного режима адресации. Ниже приведены некоторые регистры адреса.
• Указатель сегмента. В компьютерах с сегментной организацией оперативной памяти (о сегментной организации речь шла в главе 7) выделяется специальный регистр сегмента, в котором хранится базовый адрес сегмента. Таких регистров может быть несколько, один хранит базовый адрес сегмента операционной системы, а другой (другие) — базовый адрес сегмента текущего процесса (или нескольких параллельно выполняемых процессов).
• Индексные регистры. Эти регистры используются в режимах адресации с индексацией, и в некоторых процессорах при обращении к ним автоматически выполняется приращение или уменьшение значения на 1 (происходит автоиндексация).
• Указатель стека. Если в компьютере механизм управления системным стеком программно доступен, то стек размещается в оперативной памяти и выделяется специальный регистр, который содержит текущее значение указателя вершины стека. Наличие системного стека позволяет неявно специфицировать операнды в нульадресных командах.
Перед конструктором процессора встает несколько вопросов, связанных с организацией регистров. Первый из них — следует ли отдать предпочтение универсальным программно доступным регистрам или специализировать их на выполнение определенного круга функций. Мы уже касались этого вопроса в предыдущей главе, поскольку он связан и с проблемой проектирования системы команд. Если в процессоре существуют специализированные регистры, то их применение специфицируется неявно через код операции, который требует участия в определенной операции именно такого-то регистра и никакого другого. Явная спецификация операнда при такой организации может только уточнить, какой именно из группы регистров одинакового назначения будет использоваться при выполнении данной команды (если специализированные регистры объединены в группы по назначению). В результате сохраняется пространство в коде команды для другой информации. С другой стороны, любая специализация ограничивает программиста в использовании ресурсов процессора. Поэтому не существует однозначного решения этой проблемы, пригодного на все случаи жизни, но в последних разработках все четче прослеживается тенденция к более узкой специализации регистров.
Другой вопрос, встающий перед конструктором процессора, — сколько регистров включить в его состав. Опять же с ответом на него связан и формат команд — чем больше регистров, тем больший размер поля спецификации регистров в команде. Принято считать, что оптимальное количество программно доступных регистров находится в диапазоне от 8 до 32 . Чем меньше регистров в процессоре, тем чаще придется обращаться к оперативной памяти, а значит медленнее будет выполняться программа. Тем не менее увеличение количества регистров свыше определенного порога не приводит к дальнейшему сокращению частоты обращения к памяти, а значит затраты на их включение в процессор не окупаются . Но в последних разработках процессоров с RISC-архитектурой конструкторы стали применять новый подход, который влечет за собой повышение эффективности работы процессора при включении в его состав сотен регистров.
И наконец, последний вопрос проектирования набора регистров — выбор разрядности. Понятно, что регистры, предназначенные для хранения адресов, должны иметь разрядность, соответствующую длине адреса при включении в состав компьютера оперативной памяти максимального объема. Регистры данных должны иметь разрядность, позволяющую хранить элементы большинства типов данных, используемых в проектируемой модели компьютера. В некоторых конструкциях процессоров пары регистров организованы таким образом, что могут совместно хранить единый элемент данных удвоенной длины.
Регистры условий также в определенной мере программно доступны, хотя набор операций с ними со стороны программы очень ограничен. Эти регистры (или регистр) хранят однобитовые коды условий, которые принято называть флагами. Большинство флагов устанавливается процессором в зависимости от значения результата последней выполненной арифметической или логической операции. Например, арифметическая операция может породить положительный или отрицательный результат, равный нулю или отличный от нуля, может произойти переполнение и т.д. Все эти свойства результата фиксируются в соответствующих флагах дополнительно к собственно результату, который фиксируется в каком-либо регистре данных или в ячейке памяти. Эти флаги могут быть затем проанализированы при выполнении команд условного перехода.
Биты кодов условий объединяются в один или несколько регистров условий. Обычно они включаются в регистр управления. В общем случае эти флаги могут анализироваться машинными командами, но машинная команда не может их явно изменить. (Это возможно только при выполнении арифметической команды со специально подобранными значениями операндов.)
В некоторых процессорах при выполнении команд вызова подпрограмм автоматически сохраняется вся информация, размещенная в программно доступных регистрах. При выходе из подпрограммы эта информация восстанавливается. Такой механизм вызова и возврата из подпрограммы позволяет каждой подпрограмме независимо пользоваться всеми регистрами. В других процессорах такого автоматического сохранения восстановления не происходит, и заботы о сохранении информации в регистрах перекладываются на программиста.