К доступным регистрам пользователь может обращаться с помощью команд машинного языка. К этим регистрам, как правило, имеют доступ все программы — как приложения, так и системные. Обычно среди доступных регистров есть регистры данных, адресные регистры и регистры кода условия.
Регистры данных. Программист может применять их в различных целях. В ряде случаев они имеют общее назначение и могут использоваться любой машинной командой для операций с данными. Однако зачастую при этом накладываются определенные ограничения. Например, некоторые регистры предназначены для операций над числами с плавающей точкой, в то время как остальные — для хранения целых чисел.
Адресные регистры. В них заносятся адреса команд и данных в основной памяти; в этих регистрах может быть записана только часть адреса, использующаяся при вычислении полного или эффективного адреса. Рассмотрим следующие примеры.
• Индексный регистр. Используется в обычном режиме адресации, когда адрес получается в результате сложения содержимого индексного и базового регистра.
• Сегментный регистр. При сегментной адресации память разделяется на блоки (сегменты), состоящие из различного количества машинных слов. Адрес ячейки памяти складывается из адреса сегмента и смещения относительно начала сегмента. Имея представление о таком режиме адресации, легче будет усвоить материал, изложенный в главе 7, "Управление памятью", в которой обсуждаются методы управления памятью. При этом режиме адресации базовый адрес сегмента (его начало) хранится в одном из регистров. Таких регистров может быть несколько; например, один — для операционной системы (т.е. использующийся при выполнении процессором кода операционной системы), другие — для исполняющихся в данный момент приложений.
• Регистр стека. При стековой адресации выделяется специальный регистр, в котором размещен указатель на вершину стека. Этот режим адресации позволяет использовать некоторые команды, в которых отсутствует поле адреса, например push и pop.
В некоторых машинах вызов процедуры или подпрограммы приводит к автоматическому сохранению содержимого всех доступных пользователю регистров, чтобы по возвращении их можно было восстановить. Процедура сохранения и восстановления, являющаяся составной частью команды вызова и возврата, выполняется процессором. Такой подход позволяет процедурам использовать регистры независимо друг от друга. В других машинах операция сохранения содержимого регистров, выполняемая при вызове процедуры, является обязанностью программиста, который должен включить в программу необходимые команды. Таким образом, в зависимости от типа машины функция сохранения и восстановления может выполняться либо аппаратно, либо программно.