Введение

Индексный регистр центрального процессора – это регистр процессора (или выделенная область памяти), используемый для модификации адресов операндов в процессе выполнения программы. Он полезен для последовательного доступа к элементам строк и массивов, а также для хранения счетчиков итераций циклов. В некоторых архитектурах он применяется для чтения и записи блоков памяти. В зависимости от архитектуры, это может быть специализированный индексный регистр или регистр общего назначения. Некоторые наборы инструкций поддерживают использование нескольких индексных регистров, при этом дополнительные поля инструкции указывают, какие регистры следует использовать. Обычно содержимое индексного регистра добавляется (в некоторых случаях вычитается) из непосредственного адреса (который может быть частью самой инструкции или храниться в другом регистре) для формирования "эффективного" адреса данных (операнда). Обычно предусмотрены специальные инструкции для проверки значения индексного регистра, и в случае неудачи, регистр увеличивается на заданную константу с последующим переходом, как правило, к началу цикла. В то время как большинство процессоров, поддерживающих несколько индексных регистров, суммируют их содержимое, в компьютерах IBM существовала линейка, где содержимое регистров выполнялось побитовое ИЛИ. Индексные регистры оказались эффективными при выполнении векторных и операций с массивами, а также в системах коммерческой обработки данных для перемещения между полями записей. В обоих случаях индексные регистры существенно снижали объем используемой памяти и повышали скорость выполнения.

История

В ранних компьютерах, не имевших какой-либо формы косвенной адресации, операции с массивами приходилось выполнять путем модификации адреса инструкции, что требовало нескольких дополнительных шагов программы и использовало больше компьютерной памяти – дефицитного ресурса в компьютерных установках ранней эпохи (а также в ранних микрокомпьютерах два десятилетия спустя). Индексные регистры, обычно известные как B-линии в ранних британских компьютерах, как B-регистры на некоторых машинах и X-регистры на других, впервые были использованы в британском компьютере Manchester Mark 1 в 1949 году. В целом, индексные регистры стали стандартной частью компьютеров во время второго поколения технологий, примерно в 1954–1966 годах. Большинство машин серии IBM 700/7000 имели их, начиная с IBM 704 в 1954 году, хотя они были необязательными на некоторых небольших машинах, таких как IBM 650 и IBM 1401. Ранние "маленькие машины" с индексными регистрами включают AN/USQ 17, примерно в 1960 году, и 9-ю серию компьютеров реального времени от Scientific Data Systems, начиная с начала 1960-х годов. UNIVAC 1107 1962 года имеет 15 X-регистров, четыре из которых также были A-регистрами. GE 635 1964 года имеет 8 выделенных X-регистров; однако он также позволяет индексировать с помощью счетчика инструкций или любой половины A- или Q-регистра. PDP 6 от Digital Equipment Corporation (DEC), представленный в 1964 году, и IBM System/360, анонсированный в 1964 году, не включают специальные индексные регистры; вместо этого они имеют регистры общего назначения (называемые "аккумуляторами" в PDP 6), которые могут содержать либо числовые значения, либо адреса. Адрес памяти операнда в PDP 6 представляет собой сумму содержимого регистра общего назначения и 18-битного смещения, а в System/360 – сумму содержимого двух регистров общего назначения и 12-битного смещения. Совместимая линейка PDP 10, преемников PDP 6, а также IBM System/370 и более поздние совместимые преемники System/360, включая текущую архитектуру z/Architecture, работают аналогичным образом. В 1969 году Data General Nova и преемник Eclipse, а также DEC PDP 11 1970 года, миникомпьютеры также предоставляли регистры общего назначения (называемые "аккумуляторами" в Nova и Eclipse), а не отдельные аккумуляторы и индексные регистры, как и их преемники Eclipse MV и VAX – 32-битные суперминикомпьютеры. В PDP 11 и VAX любой регистр можно было использовать при вычислении адреса памяти операнда; в Nova, Eclipse и Eclipse MV можно было использовать только регистры 2 и 3. CDC STAR 100 1971 года имеет файл регистров, состоящий из 256 64-битных регистров, 9 из которых зарезервированы. В отличие от большинства компьютеров, инструкции STAR 100 имеют только поля регистров и поля операндов, поэтому регистры служат скорее как указательные регистры, чем как традиционные индексные регистры. В то время как Intel 8008 1972 года позволял косвенную адресацию через пары регистров, первым микропроцессором с истинным индексным регистром, по-видимому, был Motorola 6800 1974 года. В 1975 году 8-битный процессор MOS Technology 6502 имел два индексных регистра – 'X' и 'Y'. В 1978 году Intel 8086, первый процессор x86, имел восемь 16-битных регистров, называемых "регистрами общего назначения", все из которых могут использоваться в качестве целочисленных регистров данных в большинстве операций; четыре из них – 'SI' (индекс источника), 'DI' (индекс назначения), 'BX' (база) и 'BP' (указатель базы) – также могут использоваться при вычислении адреса памяти операнда, который представляет собой сумму одного из этих регистров и смещения, или сумму одного из 'BX' или 'BP', одного из 'SI' или 'DI' и смещения. Intel 8088 1979 года и 16-битные Intel 80186, Intel 80188 и Intel 80286, преемники, работают аналогично. В 1985 году i386, 32-битный преемник этих процессоров, представивший 32-битную версию архитектуры x86 IA 32, расширил восемь 16-битных регистров до 32 бит, добавив "E" в начало имени регистра; в IA 32 адрес памяти операнда представляет собой сумму одного из этих восьми регистров, одного из семи из этих регистров (указатель стека не разрешен в качестве второго регистра здесь), умноженную на 1, 2, 4 или 8, и смещения. Advanced Micro Devices Opteron, первая модель которого была выпущена в 2003 году, представил x86 64 – 64-битную версию набора инструкций x86; в x86 64 регистры общего назначения были расширены до 64 бит, и было добавлено восемь дополнительных регистров общего назначения; адрес памяти операнда является суммой двух из этих 16 регистров и смещения. В 64-битной версии архитектуры ARM существует 31 64-битный регистр общего назначения, а также указатель стека и нулевой регистр; адрес памяти инструкции загрузки или сохранения является суммой любого из 31 регистра и либо смещения, либо другого из регистров.